ios_base :: sync_with_stdio(false)在stdin的两个输入之间不起作用

时间:2016-05-26 18:35:19

标签: c++ iostream cin stdio

我想知道为什么以下代码无法正常工作:

#include <iostream>
#include <string>
using namespace std;

int main(){
    int n;
    string s;
    //scanf("%d",&n);
    cin >> n;
    ios_base::sync_with_stdio(false);
    cin >> s;
    cout << n << " " << s;
    return 0;
}

输入:

10 
abcd 

输出:10

字符串未打印!如果我使用scanf输入整数,结果是一样的。但是,如果行ios_base::sync_with_stdio(false);放在第一个cin之前(或scanf之前),代码会按预期工作。

我非常感谢任何帮助澄清这种行为。

修改 输入包含在文件inp.txt中,我使用<(重定向运算符)从文件中读取,>将结果输出到out.txt,就像: a.out < inp.txt > out.txt

如果输入直接来自控制台,则代码会给出预期输出。对于任何误解或混淆,我们深表歉意。

1 个答案:

答案 0 :(得分:1)

在执行了 I / O之后调用sync_with_stdio 会导致实现定义的行为(这比cppreference的“有效”更强“)

  

效果:如果在通话前使用标准流进行了任何输入或输出操作,则效果为   实现定义。否则,使用false参数调用它   允许标准流独立于标准C运行   流。

在libc ++中,没有任何反应,因为它只是切换一个标志。在libstdc ++中,它实际上执行logic来切换流。任何进一步尝试使用流都会导致失败:

cin >> s;
cin.clear();
cin >> s;
std::cout << n << " " << s;

无论哪种方式,the libstdc++ manual都指出您需要在执行I / O之前调用函数。所以你实际拥有的是现在未定义的行为。