我了解从文件写入和读取的一般过程,但我很好奇在文件写入过程中发生了什么。例如,我编写了一个程序,将一系列数字逐行写入 .txt 文件。然而,困扰我的一件事是,直到我的 c 程序完成运行之后,我才看到写入的信息。有没有办法在程序运行时而不是之后查看写入的信息?这甚至可能吗?这是一个很难用一行来表达的问题,所以如果它已经在其他地方得到了回答,请原谅我。
我问这个的原因是因为我正在写入一个文件,并希望我可以扫描文件的最高和最低值(程序最好能够运行几个小时)。
研究缓冲和缓存。
通过以下方式执行了许多优化层:
以延长磁盘的使用寿命并提高性能。
通过仔细使用刷新命令,您通常可以在您真正需要它们时“相当快”地使事情发生,尽管您通常应该谨慎地这样做。
GNU C 库文档有一个关于文件刷新主题的好页面,列出了诸如fflush
哪些函数可以做你想做的事情。
您观察到了仅由 C 标准 I/O (stdio) 缓冲区引起的效果。我声称任何操作系统或磁盘驱动程序缓冲都与它无关。
在 stdio 中,I/O 以三种模式之一发生:
BUFSIZ
(从<stdio.h>
)累积字符。这是 I/0 重定向到文件或管道时的默认设置。这是你观察到的。通常BUFSIZ
是从 1k 到几个 kBytes 的任何地方。BUFSIZ
到达)换行符,就会写入数据。当 i/o 指向终端时,这是默认设置。您可以使用setvbuf()
( <stdio.h>
) 函数来更改默认值,分别使用_IOFBF
、_IOLBF
或_IONBF
宏。请参阅您友好的setvbuf手册页。
在您的情况下,您可以将输出流(stdout
或FILE *
返回的fopen
)设置为line buffered。
或者,您可以fflush()
在希望 I/O 发生时调用输出流,而不管缓冲如何。
事实上,在写命令和写命令之间有好几层。函数和实际文件。
首先,您打开文件进行写入。这会导致文件被创建或清空。如果您在那时写入,则写入实际上不会立即发生,而是会缓存数据,直到缓冲区已满或文件被刷新或关闭。
您可以调用fflush()
写入数据的每个部分,或者您可以实际等到文件关闭。
是的,可以查看文件中写入的内容。如果您在 Linux 下编程,您可以打开一个新终端并使用例如“less Filename ”来观察进度。