c ++函数将额外的空条目保存到文件中

时间:2018-05-08 15:35:46

标签: c++

我使用此功能修改二进制文件中现有条目的一个特定字段。它确实可以完成它的工作,但是还会在文件中添加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;是一个值,我试图修改。

2 个答案:

答案 0 :(得分:1)

读/写操作应该由文件定位操作(来自man page of fopen(3))分开。

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

另外,你应该将fread的返回值与1进行比较,而不是真实。

答案 1 :(得分:-1)

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