c - 在读取和写入操作之间刷新以更新模式打开的 fopen() 文件。需要显式刷新吗?

标签 c fopen flush read-write fseek

我读过这篇关于使用 fopen() ( LINK ) 打开文件进行更新的读写操作之间的切换(反之亦然)

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

这里有两点我想强调一下

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

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

2) 关于没有到达文件末尾的读取操作的第二部分似乎暗示如果读取操作到达文件末尾我们打算在那之后写,我们不需要为这个 read-write 转换刷新缓冲区。你能确认这就是它的意思吗?只有 write-read 转换需要刷新而不是 read-write 转换,尤其是当读取已到达文件末尾时?

最佳答案

你正确地指出了第二点,即如果我们到达 EOF 然后我们打算写它的罚款,就像 fseekSEEK_END 一样。

但对于第一点,我们需要在写入操作之后采用一个引用点来开始读取操作,即因为假设您正在尝试覆盖文件中的一些动态数据,所以长度可能会有所不同,具体取决于您可能没有得到你想的确切位置。

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

关于c - 在读取和写入操作之间刷新以更新模式打开的 fopen() 文件。需要显式刷新吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686536/

相关文章:

c++ - 如何同时迭代两个 Boost 预处理器序列?

c - 如何替换最近取消的宏 "access_ok"的第一个参数?

php - 是否可以在 php 中使用 fopen 获取 404 页面内容?

c++ - 为什么从流中读取不需要刷新缓冲区

windows - 从 Windows CLI 刷新磁盘写入缓存

c - 如何修改多参数宏的参数?

连续的截断整数除法可以用乘法代替吗?

php - 除了 fclose() 和 fopen() 之外,如何在 PHP 中重新倒回 () 一个 http 流文件?

SQL Server 日志文件困惑