fputs和fflush,写入和缓冲处理

4

我对C语言中的写入操作感到困惑。我有一个字符串s,想要将其写入输出。为此,我使用fputs函数:

fputs(s, stdout);

但是显然这并不是直接写入输出,而仅仅是收集要写入的数据?它到底收集在哪里呢?所以我必须等待程序退出或者调用fflush()函数,才能实际将输出写入标准输出(stdout)中?我的理解正确吗?


1
有时候输出并不会被刷新,直到写入一个换行符\n - Paulo Bu
@PauloBu 对于printf是正确的,但对于fputs不是。 - Zaffy
2
@zaffy 不,缓冲模式是流的属性,而不是写入流的函数的属性。 - Jens
我的程序正在运行。我只是想知道当调用fputs时数据从哪里收集,以及在调用fflush时数据写入到哪里。如果我的表述不够清晰,我很抱歉。 - George Newton
1
数据是通过类型为FILE的stdout“收集”的,它封装了许多内部簿记信息。通过调试器逐步执行fputs,您将看到它的工作原理。不过这可能相当困难。 - Jabberwocky
显示剩余7条评论
1个回答

3

C标准IO流有三种模式:

  1. 完全缓冲
  2. 行缓冲
  3. 不带缓冲

您可以使用setvbuf()函数设置模式。所有这些都在标准IO实现的深层内部发生。如果您希望立即显示数据,请使用不带缓冲的模式。

引用C99 7.19.3#3:

当一个流是“无缓冲”的,字符将尽快从源或目的地中显示。否则,字符可以累积并作为块传输到或从主机环境中。当一个流是“完全缓冲”的时,只有在填满缓冲区后字符才会被传输到或从主机环境中传输。当一个流是“行缓冲”的时,只有在遇到换行符时字符才会被传输到或从主机环境中传输。此外,在需要从主机环境传输字符的行缓冲流上请求输入时,字符应被作为块传输到主机环境。这些特性的支持是实现定义的,并且可能会通过setbuf和setvbuf函数受到影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接