【问题标题】:fputs and fflush, writing and buffer processfputs和fflush,写入和缓冲过程
【发布时间】:2014-02-27 17:58:06
【问题描述】:

我对 C 语言中的写入处理方式感到困惑。所以我有一个字符串 s,我想将其写入输出。为此,我使用 fputs:

fputs(s, stdout);

但显然这并没有写入输出,而只是收集数据进行写入?它究竟是在哪里收集的?所以我必须等到程序退出或者直到我调用 fflush() 直到输出实际写入标准输出?我说的对吗?

【问题讨论】:

  • 有时输出不会刷新,直到写入行尾\n
  • @PauloBu 对于 printf 来说是这样,对于 fputs 则不然。
  • @Zaffy 点了,我认为它可能是相似的。
  • @zaffy 不,缓冲模式是流的属性,而不是写入流的函数。
  • 数据是通过标准输出“收集”的,如果是 FILE 类型,它封装了许多内部簿记内容。使用调试器单步执行fputs,您将看到它是如何工作的。不过,这可能非常艰难。

标签: c buffer stdio


【解决方案1】:

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

  1. 完全缓冲
  2. 行缓冲
  3. 无缓冲

您可以使用setvbuf() 函数设置模式。这一切都发生在标准 IO 实现的深处。如果您希望数据立即显示,请使用无缓冲模式。

引自 C99 7.19.3#3:

当流无缓冲时,字符会从 尽快到达源头或目的地。否则字符可能是 作为一个块累积和传输到主机环境或从主机环境传输。当一个 流是完全缓冲的,字符旨在传输到或从 填充缓冲区时将主机环境作为一个块。当流是 行时 缓冲,字符旨在传输到主机或从主机传输 遇到换行符时将环境作为一个块。此外, 字符旨在作为块传输到主机环境 当缓冲区被填满时,当在无缓冲流上请求输入时,或 当在需要传输的行缓冲流上请求输入时 来自主机环境的字符。对这些特性的支持是 实现定义,并可能通过setbufsetvbuf函数受到影响。

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2019-06-30
    • 1970-01-01
    • 2015-04-10
    相关资源
    最近更新 更多