我使用此功能修改二进制文件中现有条目的一个特定字段。它确实可以完成它的工作,但是还会在文件中添加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是一个包含几个变量的结构:&#34; idPro&#34;包含自动分配的唯一编号。 &#34;埃斯塔&#34;检查条目是否有效并且&#34; valor&#34;是一个值,我试图修改。
答案 0 :(得分:1)
读/写操作应该由文件定位操作(来自man page of fopen(3))分开。
在fwrite行后添加fseek(p,0,SEEK_CUR);
以强制执行此操作。
另外,你应该将fread的返回值与1进行比较,而不是真实。
答案 1 :(得分:-1)
考虑到你的struct(proyecto)不是字节对齐的,编译器可能正在填充它。如果是这样,请定义结构的预期大小,并使用它而不是sizeof(proyecto)