printf函数返回中的“传输”是啥意思?
Posted
技术标签:
【中文标题】printf函数返回中的“传输”是啥意思?【英文标题】:What does 'transmitted' mean in printf function return?printf函数返回中的“传输”是什么意思? 【发布时间】:2015-02-27 03:00:48 【问题描述】:我对标准 C 库中 printf
的返回值和缓冲流的解释感到困惑。
在C99:TC3 Standard 中,7.19.6.3/p3 定义printf
函数成功返回非负数“传输的字符数”。
此外,7.19.3/p3 描述了“transmitted to or from the host environment”的全/行缓冲流的行为,p7 说stdout
可以是全缓冲流。
引用第 7.19.3 节并添加重点:
7.19.3 文件
3 当流无缓冲时,字符会尽快从源或目标出现。否则,字符可能会被累积并作为一个块传入或传出主机环境。当一个流被完全缓冲时,当一个缓冲区被填满时,字符将被作为一个块传送到主机环境或从主机环境传送。 当流被行缓冲时,当遇到换行符时,字符将作为块传输到主机环境或从主机环境传输。此外,当缓冲区被填满、在非缓冲流上请求输入或在需要从主机环境传输字符。对这些特性的支持是由实现定义的,可能会受到
setbuf
和setvbuf
函数的影响。7 [...] 最初打开时,标准错误流没有完全缓冲;标准输入和标准输出流被完全缓冲当且仅当流可以被确定不引用交互式设备。
这些定义导致以下行为是合法的。 但这是违反直觉且无法接受的结果(至少对我而言)。
#include <stdio.h>
#include <assert.h>
// PRECONDITION: `stdout` is fully buffered
int main()
int n = printf("abc"); // "abc" is accumulated, and no transmission.
assert(n == 0); // so, return value can be equal to 0 ??
我的解释有什么错误? 还是只是“实现定义的”行为之一?
【问题讨论】:
【参考方案1】:printf
和fprintf
的返回值是传输到流(主机环境内部的对象)而不是最终目的地的字节数。这些字节何时以及如何通过流传输到文件或设备(“从主机环境传输”)是无关紧要的。缓冲不影响流如何接受来自程序的字节;只是它是否以及直到何时保留它们,直到将它们发送到关联的文件或设备。
【讨论】:
【参考方案2】:“transmitted”这个词意味着字节跨越了某个接口。我提出7.19.6.3所指的接口是printf
与设备驱动的接口,而7.19.3所指的接口是设备驱动的输出。
此外,我认为您提出的解释会使printf
的返回值任意且反复无常。
因此,我得出结论,您的示例代码中的 printf
将始终返回 3。
【讨论】:
以上是关于printf函数返回中的“传输”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章