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

Zac*_*h S 3 c file-io buffer stdio

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

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

Lig*_*ica 9

研究缓冲缓存.

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

  1. 你的申请,
  2. 你的操作系统,和
  3. 你的磁盘驱动器,

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

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

在调试时,刷新特别有用.

GNU C Library文档有一个关于文件刷新主题的好页面,列出了fflush可以做你想要的功能.


Jen*_*ens 5

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

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

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

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

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

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