如何写文件?为什么我没有立即看到我的数据?

时间:2013-06-03 13:55:43

标签: c file-io buffer stdio

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

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

4 个答案:

答案 0 :(得分:9)

研究缓冲缓存

通过以下方式执行了许多优化层:

  1. 您的申请,
  2. 您的操作系统,
  3. 您的磁盘驱动程序,
  4. 为了延长磁盘寿命并提高性能。

    仔细使用刷新命令,你通常可以在你真正需要的时候“很快”地发生事情,尽管你应该谨慎地这样做。

    Flushing can be particularly useful when debugging

    GNU C Library文档有a good page on the subject of file flushing,其中列出了fflush等可能符合您要求的功能。

答案 1 :(得分:5)

您观察到仅由C标准I / O(stdio)缓冲区引起的影响。我声称任何操作系统或磁盘驱动程序缓冲都没有没有来处理它。

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

  1. 完全缓冲,一旦BUFSIZ(来自<stdio.h>)字符累积,就会写入数据。这是I / 0重定向到文件或管道时的默认设置。这就是你观察到的。通常BUFSIZ从1k到几KB不等。
  2. 行缓冲,一旦看到换行符(或达到BUFSIZ),就会写入数据。这是i / o到终端时的默认设置。
  3. 无缓冲,会立即写入数据。
  4. 您可以使用setvbuf()<stdio.h>)功能分别使用_IOFBF_IOLBF_IONBF宏来更改默认值。查看友好的setvbuf手册页。

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

    或者,无论缓冲如何,只要您希望I / O发生,就可以在输出流上调用fflush()

答案 2 :(得分:1)

实际上,写命令之间有几层。功能和实际文件。

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

您可以调用fflush()来编写每个数据部分,或者实际上可以等到文件关闭。

答案 3 :(得分:-2)

是的,可以看到文件中写的是什么。如果您在Linux下编程,您可以打开一个新的终端并观察进度,例如&#34; less Filename &#34;。