【问题标题】:How are files written? Why do I not see my data written immediately?文件是怎么写的?为什么我看不到我的数据立即写入?
【发布时间】:2013-06-03 13:55:43
【问题描述】:

我了解文件写入和读取的一般过程,但我很好奇文件写入过程中的幕后情况。例如,我编写了一个程序,将一系列数字逐行写入 .txt 文件。然而,困扰我的一件事是,直到我的 c 程序运行完 之后,我才看到写入的信息。有没有办法在程序运行时而不是之后查看写入的信息?这甚至可能吗?这是一个很难用一行来表达的问题,所以如果它已经在其他地方得到了回答,请原谅我。

我问这个的原因是因为我正在写入一个文件,并希望我可以扫描文件的最高和最低值(程序最好能够运行几个小时)。

【问题讨论】:

  • 你需要用setvbuf()将你的输出流设置为line buffered

标签: c file-io buffer stdio


【解决方案1】:

研究缓冲缓存

以下人员执行了许多优化层:

  1. 您的应用程序,
  2. 您的操作系统,以及
  3. 您的磁盘驱动程序,

为了延长磁盘的使用寿命并提高性能。

通过谨慎使用 flushing 命令,您通常可以在您真正需要它们时“相当快”地使事情发生,尽管您通常应该谨慎地这样做。

Flushing can be particularly useful when debugging.

GNU C 库文档有 a good page on the subject of file flushing,列出了诸如 fflush 之类的函数,它们可以满足您的需求。

【讨论】:

    【解决方案2】:

    您观察到的效果仅由 C 标准 I/O (stdio) 缓冲区引起。我声称任何操作系统或磁盘驱动程序缓冲都与它无关

    在 stdio 中,I/O 以三种模式之一发生:

    1. 完全缓冲,一旦积累了BUFSIZ(来自<stdio.h>)字符,就会写入数据。这是 I/0 重定向到文件或管道时的默认设置。这是你观察到的。通常BUFSIZ 的大小在 1k 到几个 kBytes 之间。
    2. 行缓冲,一旦看到换行符(或到达BUFSIZ),就会写入数据。这是 i/o 到终端时的默认设置。
    3. 无缓冲,数据立即写入。

    您可以使用setvbuf() (<stdio.h>) 函数更改默认值,分别使用_IOFBF_IOLBF_IONBF 宏。请参阅您友好的 setvbuf 手册页。

    在您的情况下,您可以将输出流(stdoutfopen 返回的FILE *)设置为行缓冲

    或者,您可以在希望发生 I/O 时在输出流上调用 fflush(),而不考虑缓冲。

    【讨论】:

      【解决方案3】:

      确实,写命令和写命令之间有好几层。函数和实际文件。

      首先,您打开文件进行写入。这会导致文件被创建或清空。如果此时写入,实际上不会立即发生写入,而是会缓存数据,直到缓冲区已满或文件被刷新或关闭。

      你可以调用fflush()来写入每部分数据,或者你可以等到文件关闭。

      【讨论】:

        【解决方案4】:

        是的,可以查看文件中写入的内容。如果您在 Linux 下编程,您可以打开一个新终端并使用“less Filename”等命令查看进度。

        【讨论】:

        • less -f 仅在数据已写入文件时才有用,由于缓冲可能不会立即发生(问题的重点正是缓冲)。
        • 对不起,我想我误解了这个问题。
        猜你喜欢
        • 2019-08-01
        • 1970-01-01
        • 2015-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多