8

可能重复:
从标准输入读取是否会刷新标准输出?

C++ 标准保证在下次调用 std::cin 之前将打印缓冲区中包含的所有数据。像这样:

#include <iostream>

void bar()
{
    int x;
    std::cout << "Enter an integer: "; /* 1 */
    std::cin >> x; /* 2 */
}

因为这:

ISO/IEC 14882:2011

27.4.2 窄流对象 [narrow.stream.objects]

2 初始化对象cin后,cin.tie()返回&cout。其状态与 basic_ios::init (27.5.5.2) 所需的其他状态相同。

27.4.3 宽流对象 [wide.stream.objects]

2 初始化对象 wcin 后,wcin.tie() 返回 &wcout。其状态与 basic_ios::init (27.5.5.2) 所需的其他状态相同。

但是在 C 中,真的不能保证 stdout 缓冲区中包含的所有内容都会在任何尝试 stdin 之前被打印?

#include <stdio.h>

void bar()
{
    int x;
    printf("Enter an integer: "); /* 1 */
    scanf("%d", &x); /* 2 */
}

我知道标准输出是行缓冲的,但我不想在这种情况下放置 '\n' 字符。使用 fflush / fclose / etc 是在 C 中输入请求之前获得输出的唯一正确方法吗?

4

2 回答 2

4

不,没有这样的保证。是的,您可以使用 fflush() 来确保刷新标准输出。

这个问题密切相关:从标准输入中读取是否刷新标准输出?

于 2012-08-26T14:30:51.870 回答
3

我不知道 C++ 中的 cin / cout 关系,谢谢。在 C 中,我不知道刷新标准输出缓冲区的其他方法。当我需要确保输出已在给定时间打印时,我总是使用fflush 。

于 2012-08-26T12:35:25.353 回答