【问题标题】:Why getline skips first line?为什么 getline 跳过第一行?
【发布时间】:2011-05-07 00:58:52
【问题描述】:

在下面的代码中,getline() 跳过读取第一行。 我注意到在评论“cin >> T”行时,它可以正常工作。但我不知道原因。

我想在读行之前读一个整数!如何解决?

#include <iostream>
using namespace std;

int main () {
    int T, i = 1;
    string line;

    cin >> T;

    while (i <= T) {
        getline(cin, line);
        cout << i << ": " << line << endl;
        i++;
    }

    return 0;
}

【问题讨论】:

    标签: c++


    【解决方案1】:

    这一行只读取一个数字:

    cin >> T;
    

    如果你想解析用户输入,你需要考虑他们不断点击 因为输入被缓冲了。为了解决这个问题,有时使用 getline 读取交互式输入会更简单。然后解析该行的内容。

    std::string userInput;
    std::getline(std::cin, userInput);
    
    std::stringstream(userInput) >> T;
    

    【讨论】:

      【解决方案2】:
      cin >> T;
      

      这会消耗您在标准输入上提供的整数。

      第一次调用:

      getline(cin, line)
      

      ...您在整数之后使用换行符。

      您可以通过在cin &gt;&gt; T; 之后添加以下行来获得cinignore 的换行符:

      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
      

      (对于std::numeric_limits,您需要#include &lt;limits&gt;

      【讨论】:

        【解决方案3】:

        您的输入文件中很可能有一个换行符,并且正在立即处理,如本页所述:

        http://augustcouncil.com/~tgibson/tutorial/iotips.html

        您可能想要调用cin.ignore() 让它拒绝一个字符,但是,您可能想要阅读更多提示,因为这里有关于如何处理读取数字的建议。

        【讨论】:

        • @Osama:该页面上有详细记录。我为my answer 添加了一个简单的修复程序,但您应该真正阅读并理解解释。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 2015-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多