C 文件是如何编写的?为什么我看不到我的数据立即写入?
我了解从文件中写入和读取的一般过程,但我很好奇在文件写入过程中引擎盖下发生了什么。例如,我编写了一个程序,将一系列数字逐行写入.txt文件。然而,困扰我的一件事是,直到我的c程序完成运行后,我才看到编写的信息。有没有一种方法可以在程序运行时而不是运行后查看写入的信息?这可能吗?这是一个很难用一行字表达的问题,所以如果其他地方已经回答了,请原谅我 我问这个问题的原因是因为我正在写一个文件,希望能扫描该文件的最高值和最低值(程序最好能运行几个小时)。研究缓冲和缓存 有多个优化层由以下人员执行:C 文件是如何编写的?为什么我看不到我的数据立即写入?,c,file-io,buffer,stdio,C,File Io,Buffer,Stdio,我了解从文件中写入和读取的一般过程,但我很好奇在文件写入过程中引擎盖下发生了什么。例如,我编写了一个程序,将一系列数字逐行写入.txt文件。然而,困扰我的一件事是,直到我的c程序完成运行后,我才看到编写的信息。有没有一种方法可以在程序运行时而不是运行后查看写入的信息?这可能吗?这是一个很难用一行字表达的问题,所以如果其他地方已经回答了,请原谅我 我问这个问题的原因是因为我正在写一个文件,希望能扫描该文件的最高值和最低值(程序最好能运行几个小时)。研究缓冲和缓存 有多个优化层由以下人员执行: 你的
GNU C库文档中列出了一些函数,如
fflush
,它们可以执行您想要的操作。事实上,在写入命令和。函数和实际文件
首先,打开文件进行写入。这会导致创建或清空文件。如果您当时写入,写入实际上不会立即发生,但数据会被缓存,直到缓冲区已满或文件被刷新或关闭
您可以调用
fflush()
来写入数据的每一部分,也可以等待文件关闭。是的,可以查看文件中写入的内容。如果您在Linux下编程,您可以打开一个新的终端,并使用例如“less Filename”来观看进度。您观察到的效果完全是由C标准I/O(stdio)缓冲区引起的。我声称任何操作系统或磁盘驱动程序缓冲都与此无关
在stdio中,I/O以三种模式之一发生:
BUFSIZ
(来自
)字符累积。这是将I/0重定向到文件或管道时的默认设置。这就是你观察到的。通常,BUFSIZ
的大小介于1k到几KB之间BUFSIZ
),就会写入数据。当i/o连接到终端时,这是默认值setvbuf()
(
)函数分别使用\u IOFBF
、\u IOLBF
或\u iobf
宏来更改默认值。查看您的友好手册页
在您的情况下,您可以将输出流(stdout
或fopen
返回的文件*
)设置为行缓冲
或者,您可以在需要I/O时调用输出流上的
fflush()
,而不考虑缓冲。less-f
仅在数据已写入文件时才有用,因为缓冲可能不会立即发生。抱歉,我想我误解了这个问题。您需要将输出流设置为使用setvbuf()
缓冲的行。