【发布时间】:2016-01-13 23:28:55
【问题描述】:
程序应该更改记录中的特定值,我使用 fseek 和 fwrite 来执行此操作。但是当我运行它时,它会覆盖下一条记录。
这是我的程序的一部分:
j = 0;
while ((fread(&Rec, sizeof(Rec), 1, file) == 1) && (Found == 0))
{
if (strcmp(Rec.Name, SearchName) == 0)
{
if (Rec.BD == SearchBD)
{
Found = 1;
printf("\nEnter the new value : ");
scanf("%f", &Val);
fseek(file, (sizeof(Rec))*j, SEEK_SET);
strcpy(Rec.Name, SearchName);
Rec.BD = SearchBD;
Rec.V = Val;
fwrite(&Rec, sizeof(Rec), 1, file);
}
}
j++;
}
【问题讨论】:
-
字符串函数在评估二进制文件中的内容时效果不佳。字符串函数仅适用于字符串,即以 NULL 字符结尾的 char 数组。如果没有 NULL,
strcmp函数将产生意想不到的结果。 Look here 进行涵盖类似请求的对话。 -
是的,好吧,Rec、Val 等类型丢失了,所以我们不知道发生了什么。 'strcpy(Rec.Name, SearchName);'在 'if (strcmp(Rec.Name, SearchName)' 块内有点毫无意义/令人担忧:(
-
@ryyker,如果二进制文件是用 C 结构编写的,那么它们可以毫无问题地回读。 C 结构在编写时将全部包含以空字符结尾的字符数组,这些字符数组将被回读。
-
虽然不能解决问题,但
while必须写成while ((Found == 0) && (fread(&Rec, sizeof(Rec), 1, file) == 1)),否则found后面会多出一个fread -
@MartinJames 我知道这毫无意义,我正在做额外的测试以防万一>
标签: c binaryfiles fwrite