更改二进制文件中的值 (C)
Change a value in a binary file (C)
程序应该更改记录中的特定值,我使用 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++;
}
您的代码无法覆盖下一条记录。代码是正确的。但是,如果您在程序中进一步使用 Rec
(您只给出了一个片段),那么您会发现 Rec
具有意想不到的值。那是因为找到要查找的记录后,while
循环再执行一次fread
才退出循环。那是因为 while
循环必须写成:
while ((Found == 0) && (fread(&Rec, sizeof(Rec), 1, file) == 1))
否则将在 found
被测试并退出循环之前执行另一个 fread
。
程序应该更改记录中的特定值,我使用 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++;
}
您的代码无法覆盖下一条记录。代码是正确的。但是,如果您在程序中进一步使用 Rec
(您只给出了一个片段),那么您会发现 Rec
具有意想不到的值。那是因为找到要查找的记录后,while
循环再执行一次fread
才退出循环。那是因为 while
循环必须写成:
while ((Found == 0) && (fread(&Rec, sizeof(Rec), 1, file) == 1))
否则将在 found
被测试并退出循环之前执行另一个 fread
。