fseek(fp,0,SEEK_CUR)的副作用是什么?

3

据推测,这行代码应该没有作用;从当前位置寻求0字节。但我在一些旧的代码中发现了这行代码,如果没有它,似乎什么都不能工作——即使在Python中使用等效的fp.seek(0, os.SEEK_CUR)。

是缓存问题,还是更深层次的问题呢?


A successful call to the fseek() function clears the end-of-file indicator for the stream and undoes any effects of the ungetc(3) and ungetwc(3) functions on the same stream. - William Pursell
1个回答

4
C标准规定,当在同一个文件句柄上进行读写转换时,必须进行定位操作。参见C11 7.21.5.3p7
  1. 以更新模式打开文件(在上述模式参数值列表中,第二个或第三个字符为'+'),关联流可以执行输入和输出。然而,在没有调用fflush函数或文件定位函数(fseekfsetposrewind)的情况下,不得直接使用输出操作后跟输入操作,也不得直接使用输入操作后跟输出操作,除非输入操作遇到了文件结束符。[...]
在C标准修订版C11 7.21.9.2p5中,fseek的所有副作用如下:
  1. 在确定新位置之后,成功调用fseek函数会撤销流上ungetc函数的所有影响,清除流的文件结束标识,然后建立新位置。在成功的fseek调用之后,更新流上的下一步操作可以是输入或输出。
对于Python 3,并非所有情况都适用于C stdio,因为Python 3在尽可能的情况下绕过C stdio;而且Python甚至不公开ungetc。Python 2文件只是C stdio流的一个薄包装器。

2
啊,那就是了 - 它存在于文件处理的读取和写入部分之间。 - user1456632

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接