C FPUT和fflush、写入和缓冲过程

C FPUT和fflush、写入和缓冲过程,c,buffer,stdio,C,Buffer,Stdio,我对C语言中的写入过程感到困惑,所以我有一个字符串s,我想写入输出。为此,我使用FPUT: fputs(s, stdout); 但显然,这并没有写入输出,而只是收集用于写入的数据?具体在哪里收集?所以我必须等到程序退出或者调用fflush()直到输出被写入标准输出?我说得对吗?C标准IO流以三种模式之一运行: 完全缓冲 行缓冲 无缓冲 您可以使用该功能设置模式。这一切都发生在标准IO实现的深处。如果希望数据立即显示,请使用无缓冲模式 引用C99 7.19.3#3: 当流未缓冲时,字符将从 尽快

我对C语言中的写入过程感到困惑,所以我有一个字符串s,我想写入输出。为此,我使用FPUT:

fputs(s, stdout);

但显然,这并没有写入输出,而只是收集用于写入的数据?具体在哪里收集?所以我必须等到程序退出或者调用fflush()直到输出被写入标准输出?我说得对吗?

C标准IO流以三种模式之一运行:

  • 完全缓冲
  • 行缓冲
  • 无缓冲
  • 您可以使用该功能设置模式。这一切都发生在标准IO实现的深处。如果希望数据立即显示,请使用无缓冲模式

    引用C99 7.19.3#3:

    当流未缓冲时,字符将从 尽快到达目的地。否则,字符可能会被删除 以块的形式累积并传输到主机环境或从主机环境传输。当 流被完全缓冲,字符将被发送到或从中发送 当缓冲区被填满时,主机环境将作为一个块。当一条溪流是直线时 缓冲的字符用于向主机发送或从主机发送 遇到新行字符时,将环境作为块。此外,, 字符将作为块传输到主机环境 当缓冲区被填满时,当在未缓冲流上请求输入时,或 当在需要传输的线路缓冲流上请求输入时 来自宿主环境的字符数。对这些特性的支持是 已定义实现,并可能通过
    setbuf
    setvbuf
    功能受到影响


    有时输出直到行尾
    \n
    被写入后才会刷新。@PauloBu这对于printf是正确的,而不是fputs。@Zaffy点,我认为它可能类似。@Zaffy不,缓冲模式是流的属性,而不是写入流的函数的属性。数据有点“收集”通过stdout,它是一种文件类型,封装了许多内部簿记内容。使用调试器逐步执行fputs,您将看到它是如何工作的。但这可能相当困难。