3

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

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

4

4 回答 4

9

研究缓冲缓存

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

  1. 你的申请,
  2. 您的操作系统,以及
  3. 你的磁盘驱动程序,

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

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

在调试时刷新特别有用

GNU C 库文档有一个关于文件刷新主题的好页面,列出了诸如fflush哪些函数可以做你想做的事情。

于 2013-06-03T13:58:29.903 回答
5

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

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

  1. 完全缓冲,数据被写入一次BUFSIZ(从<stdio.h>)累积字符。这是 I/0 重定向到文件或管道时的默认设置。这是你观察到的。通常BUFSIZ是从 1k 到几个 kBytes 的任何地方。
  2. Line buffered,一旦看到(或BUFSIZ到达)换行符,就会写入数据。当 i/o 指向终端时,这是默认设置。
  3. 无缓冲,数据立即写入。

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

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

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

于 2013-06-03T14:06:56.803 回答
1

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

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

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

于 2013-06-03T13:58:40.273 回答
-2

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

于 2013-06-03T14:01:48.787 回答