while (fread(&product, sizeof(Product), 1, file) == 1) {
product.price *= 2.0;
fseek(file, -sizeof(Product), SEEK_CUR);
fwrite(&product, sizeof(Product), 1, file);
fseek(file, 0, SEEK_CUR);
}
使用上面的代码,我尝试将二进制文件中每个产品的价格翻倍,其中每条记录都是Product结构的一个实例。当我运行这段代码时,它正确地更新了文件中的所有价格。
据我所知,fread
自动将文件指针移动到下一条记录。使用第一个fseek
,代码将文件指针移动回记录的开头。然后它使用fwrite
更新它。fwrite
自动将文件指针移动到下一条记录。在while循环中,fread
应该继续读取下一条记录,依此类推。
似乎fseek(file,0,SEEK_CUR);
在这里是不必要的。但是,如果我删除它,代码会进入一个无限循环。我不明白为什么会发生这种情况。
我试图使用ftalk
观察文件指针的值。但是我没有看到fseek(file,0,SEEK_CUR);
之后它的值有任何变化。
当一个流同时打开读写时,不允许直接在读写之间切换。ISOC11标准的§7.21.5.3¶7规定如下:
当使用update mode('作为上述模式参数值列表中的第二个或第三个字符)打开文件时,可以在关联的流上执行输入和输出。但是,如果没有对fflush函数或文件定位函数(fseek、fsetpos或reever)的中间调用,则不得直接在输出后面跟随输入,除非输入操作遇到文件结束。
如果你把线去掉
fseek(file, 0, SEEK_CUR);
那么你的程序违反了这条规则,它会调用未定义的行为。这意味着任何事情都可能发生,其中包括您的程序陷入无限循环的可能性。