我理解从文件写入和读取的一般过程,但我很好奇文件写入过程中发生的事情。例如,我编写了一个程序,将一系列数字逐行写入.txt文件。然而,困扰我的一件事是,在我的c程序完成运行之后我才看到写入的信息。有没有办法在程序运行时而不是之后看到写的信息?这甚至可能吗?在一行中这是一个很难回答的问题,所以请原谅我,如果它已经在其他地方得到了解答。
我问这个的原因是因为我正在写一个文件,并希望我能扫描文件中的最高值和最低值(该程序最好能够运行几个小时)。
答案 0 :(得分:9)
研究缓冲和缓存。
通过以下方式执行了许多优化层:
为了延长磁盘寿命并提高性能。
仔细使用刷新命令,你通常可以在你真正需要的时候“很快”地发生事情,尽管你应该谨慎地这样做。
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以三种模式之一发生:
BUFSIZ
(来自<stdio.h>
)字符累积,就会写入数据。这是I / 0重定向到文件或管道时的默认设置。这就是你观察到的。通常BUFSIZ
从1k到几KB不等。BUFSIZ
),就会写入数据。这是i / o到终端时的默认设置。您可以使用setvbuf()
(<stdio.h>
)功能分别使用_IOFBF
,_IOLBF
或_IONBF
宏来更改默认值。查看友好的setvbuf手册页。
在您的情况下,您可以将输出流(stdout
或FILE *
返回的fopen
)设置为行缓冲。
或者,无论缓冲如何,只要您希望I / O发生,就可以在输出流上调用fflush()
。
答案 2 :(得分:1)
实际上,写命令之间有几层。功能和实际文件。
首先,打开文件进行编写。这会导致文件被创建或清空。如果你写的话,写入实际上不会立即发生,但数据会被缓存,直到缓冲区已满或文件被刷新或关闭。
您可以调用fflush()
来编写每个数据部分,或者实际上可以等到文件关闭。
答案 3 :(得分:-2)
是的,可以看到文件中写的是什么。如果您在Linux下编程,您可以打开一个新的终端并观察进度,例如&#34; less Filename &#34;。