在Linux和Windows下混合cin和getline

时间:2012-10-22 00:15:11

标签: c++ windows linux getline cin

我知道混合cin和getline的常见问题。我相信这是不同的。

这是该计划:

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

int main() {
  int a;
  string line;
  cin >> a;
  printf("A is '%d'\n", a);
  getline(cin, line);
  printf("Line is '%s'\n", line.c_str());
  cout << cin.fail() << cin.eof() << cin.bad() << endl;
}

我也有一个使用istream :: getline编写的版本。我相信这里给出的所有输入案例的结果都是一样的。

a.out < test1
A is '1'
'ine is ' abc 2
000

a.out < test2
A is '1'
Line is ' abc 2'
000

其中test1为$'1 abc 2\r\n'(9字节),test2为$'1 abc 2\n'(8字节)。

我没有在Windows下明确地完成这些测试,但我确实预测输出是“按预期”,即与测试2的输出相同。

我的问题是:解释测试1的输出。 例如:为什么printf输出损坏;是否存在与行结尾解释相关的可移植性问题;如何通过最小的逻辑变化来修复代码。

1 个答案:

答案 0 :(得分:2)

在Linux下,getline从输入流中删除\n。但是,它不会删除\r

回车\r光标返回到当前行的开头。因此,在printf调用中,当STDOUT游标看到\r时,它会返回到行的开头。它打印的下一个字符是',它会覆盖该行的第一个字符(L)。

如果文件中没有\r,则不会看到此行为。

解决此问题的简单解决方案:在Linux和Unix下运行时手动检查\r