【问题标题】:Read an unknown number of lines from console in c++在 C++ 中从控制台读取未知数量的行
【发布时间】:2011-12-20 07:50:31
【问题描述】:

我正在使用以下循环从控制台读取未知数量的行,但它不起作用。在我输入输入后,我一直按 Enter 但循环不会停止。

vector<string> file;    
string line;
while(getline(cin,line)
    file.push_back(line);

【问题讨论】:

  • 你想知道什么时候停止收集?
  • 您需要使用程序等待的特殊字符或关键字。输入后,您就可以停止收集行了。
  • “空行”和“无行”是有区别的。

标签: c++ string input iostream


【解决方案1】:

因为getline 将评估为真,即使您只按回车。

您需要将读取的string 与空字符串进行比较,如果为真则中断。

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

【讨论】:

  • 没有必要与换行符进行比较,因为它永远不会发生,因为 getline() 会从其返回中去除分隔符:cplusplus.com/reference/string/getline
  • @LuchianGrigore 你能帮帮我吗?虽然我使用了相同的代码,但当我输入刚刚输入时,它并没有退出循环。
  • @LakshmiNarayanan 只有当它读取一个空行时,while 循环才会停止,所以你需要按两次 enter,因为你需要用一个空行来输入输入(我相信你这一次我已经弄清楚了 :) 但它是为未来的读者准备的)
【解决方案2】:

试试:

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

【讨论】:

    【解决方案3】:

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

    您的应用程序应使用eof() 测试文件结束条件

    【讨论】:

    • 问题不是读取表单文件,而是从控制台读取。
    • @Luchian:我不同意。我认为 Ctrl-D 或 Ctrl-Z 是 OP 正在寻找的。但是,我认为eof() 建议已关闭。如果不是这样,我会投赞成票。
    • "在我输入输入后,我一直按回车,但循环没有停止。" - 我认为他正在寻找一个解决方案,在按下回车键时循环退出;我觉得很清楚。
    【解决方案4】:

    getline 很简单,正如其他答案所建议的那样:

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

    但是对于cin objects我找到了一种不需要任何破坏字符的方法。您必须使用相同的变量来 cin 所有对象。使用后,您需要将其设置为默认退出值。然后检查下一个cin之后你的变量是否相同。示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多