3

fopen()我已阅读有关使用(链接)打开以进行更新的文件的读取和写入操作(反之亦然)之间的切换

“对于为更新而打开的文件(包含“+”号的文件),在这些文件上允许输入和输出操作,应在随后的写入操作之间刷新(fflush)或重新定位(fseek、fsetpos、rewind)流通过读取操作或未到达文件末尾的读取操作,然后进行写入操作。”

这里提到了两件事,我想强调一下

  • 应该在写入操作和读取操作之间刷新(fflush)或重新定位(fseek,fsetpos,rewind)流
  • 或未到达文件末尾的读取操作,然后是写入操作。

1)关于第一点,我们是否明确需要在写入和读取操作之间刷新。我的意思是,假设我们打算写入一个新文件,然后再读回它。在这种情况下,使用fseek()orrewind()开始写入后的文件是有意义的,并且作为副作用,它将刷新缓冲区。但我想知道的是,如果我们用新数据更新/覆盖已经存在的文件的第一部分会发生什么,但是一旦完成,我们想立即开始读取剩余的旧数据吗?我们是否需要使用类似的东西fseek(pFile,0,SEEK_CUR)来刷新缓冲区write-read过渡,同时不改变文件指针的位置?第二种情况也会产生同样的困惑,当我们想要读取文件的前半部分时,然后立即开始在那里写入。请回答这个问题。

2)关于第二部分reading operation which did not reach the end-of-file似乎暗示如果读取操作到达文件末尾并且我们打算在此之后写入,我们不需要为这个read-write转换刷新缓冲区。你能确认一下吗是什么意思?只有write-read转换需要刷新而不是read-write转换,特别是如果读取已经到达文件结尾?

4

1 回答 1

0

fseek您正确地确定了第二点,即如果我们达到 EOF 然后我们打算写它的罚款,它就像SEEK_END.

但是对于第一点,我们需要在写入操作之后获取一个参考点来启动读取操作,即因为假设您正在尝试覆盖文件中的一些动态数据,因此长度可能会有所不同,具体取决于您可能无法获得您正在考虑的确切位置。

例如:说文件 test.txt 有数据hello world,你想将hello文本更新为其他文本share,根据你的说法,文本应该是share world. 因此长度是相同的,您将获得准确的输出,但是如果替换hellobyesomeother文本,那么您将获得垃圾数据或没有数据(如果替换字符串太长)

于 2013-05-22T12:17:35.010 回答