【问题标题】:Flushing fopen()'ed files opened in update mode,between read and write operations.Explicit flushing needed?在读取和写入操作之间刷新以更新模式打开的 fopen() 文件。需要显式刷新吗?
【发布时间】:2013-05-22 08:04:16
【问题描述】:

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

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

这里有两点我想强调一下

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

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

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

【问题讨论】:

  • @bikram990 这很接近。但它仍然不能回答诸如fseek(pFile,0,SEEK_CUR) 是否是一个解决方案等问题。
  • 我添加了fseek(pFile,0,SEEK_CUR)的实际问题

标签: c fopen flush read-write fseek


【解决方案1】:

您正确地确定了第二点,即如果我们达到 EOF,然后我们打算将其写好,就像 fseekSEEK_END

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

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

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2012-02-01
    • 2022-01-10
    • 1970-01-01
    • 2015-11-19
    • 2021-09-30
    • 2015-10-10
    • 2013-12-12
    相关资源
    最近更新 更多