在C++中从控制台读取未知数量的行

4
我正在使用以下循环从控制台读取未知数量的行,但是它没有起作用。在输入完成后,我一直按回车键,但是循环不会停止。
vector<string> file;    
string line;
while(getline(cin,line)
    file.push_back(line);

2
你想知道什么时候停止收集数据? - Daniel A. White
你需要使用一个特殊字符或关键字,让你的程序等待。当输入该字符或关键字时,你就可以停止收集行了。 - anio
1
“空行”和“无行”是有区别的。 - Kerrek SB
4个回答

8

因为即使你只按下回车键,getline函数也会返回true。

你需要将读取到的string与空字符串进行比较,并在结果为真时跳出循环。

vector<string> file;    
string line;
while(getline(cin,line))
{
    if (line.empty())
       break;
    file.push_back(line);
}

与换行符进行比较是不必要的,因为它永远不会出现,因为getline()会从其返回值中剥离分隔符:http://www.cplusplus.com/reference/string/getline/ - nickb
1
@LuchianGrigore,你能帮我吗?虽然我使用了相同的代码,但当我只按回车键时,它没有跳出循环。 - Lakshmi Narayanan
@LakshmiNarayanan 那个 while 循环只有在读取到空行时才会停止,所以你需要按两次回车键,因为你需要用一个空行来提供输入(我相信你已经在此期间想出了解决方法 :) 但这是为了未来的读者) - Eugenio

1

尝试:

vector<string> file;    
string line;
while( getline(cin,line))
{
    if( line.empty())
        break;
    file.push_back(line);
}

1

getline 很容易,正如其他答案所建议的:

string line;
while(getline(cin,line))
{
    if (line.empty())
       break;
    file.push_back(line);
}

但是对于cin对象我发现了一种不需要任何断点字符的方法。你必须使用同一个变量来cin所有的对象。使用完毕后,需要将其设置为默认退出值。然后检查下一个cin后变量是否相同。例如:

string o;
while(true){
    cin>>o;
    if (o.compare("tmp")==0)
        break;
    // your normal code
    o="tmp";
}

0

你应该向应用程序发出文件结束的信号。在Linux上,它是Ctrl-D,在某些Microsoft系统上可能是Ctrl-Z。

而且你的应用程序应该使用eof()来测试文件结束条件。


问题不是从文件中读取,而是从控制台中读取。 - Luchian Grigore
3
我不同意。我认为OP正在寻找Ctrl-D或Ctrl-Z。然而,我认为“eof()”建议是错误的。如果不是因为那个建议,我会点赞的。 - Fred Larson
“在我输入完后,我一直按回车键,但循环不停止。” - 我认为他正在寻找一个解决方案,使循环在按下回车键时退出;我觉得这很清楚明了。 - Luchian Grigore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接