2016-11-22 82 views
0

我正在调试计算机上的文件。除了使用键盘输入,我运行该程序,如下所示:getline()无法在重定向的Linux标准输入上工作

./main < input.txt 

还有就是在我的程序代码段,看起来像这样:

do { 
    cout << "Type \"STOP\" when done: "; 
    getline(cin, myString); 
    cout << endl; 
    if (myString == "STOP") { 
     break; 
    } 
    cout << "Input next line: " << endl; 
    getline(cin, myString2); 
    cout << endl; 

    // do something with the two strings 

} while (myString != "STOP"); 

而不是停止时,有一个线在等于"STOP"(不含引号)的文件中,它始终保持循环。此前,有一个cin >> myInt,但我确保在每次通话后使用cin.ignore()。它工作正常,如果我输入的值没有重定向。

这是输出:

Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
Type "STOP" when done: 
... 

请帮我弄清楚是怎么回事!

+0

我应该!补充说我也尝试过'getline(cin,throwAwayString)'而不是'cin.ignore()'无济于事 – theEpsilon

+0

是myString是字符串还是char数组? – Eugene

+0

@Eugene它是C++标准库中的一个字符串,与'throwAwayString'我在前面的评论中试过 – theEpsilon

回答

4

好吧,我想通了!就像Basile Starynkevitch建议的那样,问题不在于我的代码,而在于输入文件。我在我的Windows笔记本电脑上编写了输入文件,并从Linux VM中运行了它,并且对导致错误的DOS行结尾存在一些混淆。

由于Windows终止他们与\r\n线和* nix终止他们只是\n,该cin.ignore()忽略了\r但不是\n,这是被读入getline()

解决方法:简单的写在Linux中输入文件,或在您的选择(通常是像View -> Line Endings -> Unix)的编辑器中使用的“UNIX”的行结束

诅咒你炮轰“标准”开发商

+1

一些编辑器(特别是Notepad ++)允许配置行尾。 –

+0

@Peter纳入回答谢谢 – theEpsilon

-1

尝试简单地使用cin命令。例如:

do { 
    cout << "Type \"STOP\" when done: "; 
    cin >> myString; 
    cout << endl; 
    if (myString == "STOP") { 
     break; 
    } 
} while (myString != "STOP"); 

这将消除对getline()功能的需要,因为你不需要存储整个线的时候,用户只应该键入一个单词("STOP")。即使用户在这种情况下输入了多个单词,编译器也只会输入第一个单词。

+0

'cin'将不起作用,因为我需要获取数据,我正在使用这些程序中的数据。它需要'getline()' – theEpsilon

相关问题