我试图更新二进制文件中的某些信息,但我在尝试向后退到行的开头遇到问题。
void updateSalary(char* filename)
{
int i = 0;
employee temp;
char c;
float increase;
FILE *fup = fopen(filename, "rb+");
if (fup == NULL)
{
printf("Unable to read the file\n");
return;
}
fread(&temp, sizeof(employee), 1, fup);
while (!feof(fup))
{
printf("How big is the increase to %s's salary?\n", temp.name);
scanf("%f", &increase);
temp.salary += increase;
fseek(fup, (i * sizeof(employee)), SEEK_SET);
fwrite(&temp, sizeof(employee), 1, fup);
fread(&temp, sizeof(employee), 1, fup);
i++;
}
fclose(fup);
}
问题是,例如,如果我选择更新2名员工,由于某种原因,while循环不会停在第2名员工并且功能继续......
提前致谢。
编辑: 好像是fwrite();函数没有前进(按位置意义)直到下一行,所以有固定的代码:
void updateSalary(char* filename, float threshold)
{
int i = 0;
employee temp;
char c;
float increase;
FILE *fup = fopen(filename, "r+b");
if (fup == NULL)
{
printf("Unable to read the file\n");
return;
}
//fread(&temp, sizeof(employee), 1, fup);
while (fread(&temp, sizeof(employee), 1, fup))
{
printf("How big is the increase to %s's salary?\n", temp.name);
rewind(stdin);
scanf("%f", &increase);
temp.salary += increase;
fseek(fup, (i * sizeof(employee)), SEEK_SET);
fwrite(&temp, sizeof(employee), 1, fup);
**fseek(fup, ((i+1) * sizeof(employee)), SEEK_SET);**
i++;
}
fclose(fup);
}
答案 0 :(得分:1)
您应该查看fopen
文档中的细则:
在更新模式('+')中,可以执行输入和输出,但是如果没有对fflush,fseek,fsetpos或rewind进行干预调用,则输入后不能输入,并且输入不能在没有干预的情况下输出调用fseek,fsetpos或rewind,除非输入操作遇到文件结尾。
读取和写入可能是缓冲的,但仍然共享一个文件位置。切换模式而不警告运行时(使用fseek
)可能会导致缓冲。
所以行
fseek(fup, (i * sizeof(employee)), SEEK_SET);
fwrite(&temp, sizeof(employee), 1, fup);
fread(&temp, sizeof(employee), 1, fup);
在写和读之间需要多一个fseek
。