提问者:小点点

fseek()函数中的零偏移量与SEEK_CUR有什么关系?


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);之后它的值有任何变化。


共1个答案

匿名用户

当一个流同时打开读写时,不允许直接在读写之间切换。ISOC11标准的§7.21.5.3¶7规定如下:

当使用update mode('作为上述模式参数值列表中的第二个或第三个字符)打开文件时,可以在关联的流上执行输入和输出。但是,如果没有对fflush函数或文件定位函数(fseek、fsetpos或reever)的中间调用,则不得直接在输出后面跟随输入,除非输入操作遇到文件结束。

如果你把线去掉

fseek(file, 0, SEEK_CUR);

那么你的程序违反了这条规则,它会调用未定义的行为。这意味着任何事情都可能发生,其中包括您的程序陷入无限循环的可能性。