C 文件是如何编写的?为什么我看不到我的数据立即写入?

C 文件是如何编写的?为什么我看不到我的数据立即写入?,c,file-io,buffer,stdio,C,File Io,Buffer,Stdio,我了解从文件中写入和读取的一般过程,但我很好奇在文件写入过程中引擎盖下发生了什么。例如,我编写了一个程序,将一系列数字逐行写入.txt文件。然而,困扰我的一件事是,直到我的c程序完成运行后,我才看到编写的信息。有没有一种方法可以在程序运行时而不是运行后查看写入的信息?这可能吗?这是一个很难用一行字表达的问题,所以如果其他地方已经回答了,请原谅我 我问这个问题的原因是因为我正在写一个文件,希望能扫描该文件的最高值和最低值(程序最好能运行几个小时)。研究缓冲和缓存 有多个优化层由以下人员执行: 你的

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

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

研究缓冲和缓存

有多个优化层由以下人员执行:

  • 你的申请
  • 你的操作系统,以及
  • 您的磁盘驱动程序
  • 以延长磁盘的使用寿命并提高性能

    通过仔细使用flush命令,您通常可以在真正需要的时候“相当快”地完成任务,尽管您通常应该谨慎地这样做


    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()
    缓冲的行。