C++ 函数将多余的空条目保存到文件中

c++ function saving extra empty entries to a file

本文关键字:存到文件 函数 多余 C++      更新时间:2023-10-16

我制作这个函数是为了修改二进制文件中现有条目上的一个特定字段。它确实可以完成它的工作,但也会在文件中添加另一个完整的条目,每个字段都在 0 中。关于可能导致这种情况的原因的任何想法?在我添加"modOk == false"验证之前,程序将添加多个条目而不是一个条目。

void option12(){
proyecto datos;
int id;
bool modOk=false;
system("cls");
cout << "Type project ID: ";
cin >> id;
FILE * p;
p = fopen("proyectos.tky","rb+");
if (p == NULL) perror ("Error opening file");
while(fread(&datos, sizeof datos, 1, p) == true && modOk == false){
if(id == datos.idPro && datos.estado == true){
system("cls");
cout << "Project found" << endl << endl;
cout << "Type new value: ";
cin >> datos.valor;
long bytes;
bytes = ftell(p) - sizeof datos;
fseek(p, bytes, SEEK_SET);
fwrite(&datos, sizeof datos, 1, p);
system("cls");
cout << "Data modified correctly" << endl;
modOk = true;
}
}
fclose(p);
if(modOk == false){
system("cls");
cout << "Project not found" << endl;
}
system("pause");
}

datos 是一个包含多个变量的结构:"idPro"包含一个自动分配的唯一编号。"estado"检查条目是否处于活动状态,而"valor"是IM尝试修改的值。

读/写操作应该用文件定位操作分隔(来自 fopen(3( 的手册页(。

在fwrite 行后添加一个fseek(p,0,SEEK_CUR);以强制执行此操作。

此外,您应该将 fread 的返回值与 1 进行比较,而不是 true。

考虑到您的结构(proyecto(没有字节对齐,编译器可能会填充它。 如果是这样,请定义结构的预期大小并使用它而不是 sizeof(proyecto(