【问题标题】:c++ getline() doesn't seem to operate correctly, Doesn't read the line till the endc++ getline() 似乎没有正确运行,直到最后才读取该行
【发布时间】:2020-11-03 07:17:31
【问题描述】:

我尝试过使用 cin.ignore();而不是虚拟变量,没有帮助。文件内容如下:

D姓名姓氏

名字2姓氏2

...

学生人数未知。

...

输出应如下所示:

姓名姓氏:D

Name2 Surname2 等级:A

但我的输出会像这样:

命名A类

姓氏S类

Name2 E 类

urname2 S 类 ...

代码如下:

#include <iostream>
#include <fstream>
using namespace std;
 
int main() 
{
    ifstream file("students.txt");
    
    if (!file.is_open()) 
    {
        cout << "file can't be opened!" << endl;
        exit(-1);
    }

        char classs;
        string name, dummy;

    while(file >> classs >> name) 
    {
        
      cin.get(classs);
      getline(cin, dummy);
      getline(cin, name);
      
      cout << name << " " << "calass " << classs << endl;
    }
}






【问题讨论】:

  • 同一个变量有多个输入操作。请将其减少为minimal reproducible example。提供最小输入数据(或使用stringstream)、实际输出和预期输出。作为这里的新用户,也可以使用tour 并阅读How to Ask
  • 您的输入中真的有空行吗?你为什么从cin读取,覆盖从文件中读取的内容?
  • 按照您的方式混合两种输入方式并不是一个好主意。只需让您的循环将每一行读取为字符串:while(getline(file, line)),然后将其放入std::istringstream 并读出值。

标签: c++ getline


【解决方案1】:

看起来您已经尝试了各种方法来完成这项工作,包括在循环中间从cin 读取file.. 非常奇怪。我建议你扔掉整个循环并尝试以下简单的方法:

您一次只阅读一行。对于您阅读的每一行,您将其放入字符串流中并从中读取值。为了让它更简单,只要读取一个字符串即可,即使它应该只是一个字符。

// Note: requires <sstream>

string line;
while(getline(file, line))
{
    istringstream iss(line);
    string cls, name, surname;
    if (iss >> cls >> name >> surname)
    {
        cout << name << " " << surname << " class: " << cls << endl;
    }
}

这确实假设总是有两个名字,而且您的输入似乎不是这种情况。

作为替代方案,您可以尝试读取单个字符,然后忽略空格,然后读取整个行的其余部分:

char cls;
string fullname;
while (getline(file >> cls >> std::ws, fullname))
{
    cout << fullname << " class: " << cls << endl;
}

请注意,上述内容有点懒惰,因此如果您在文件中遇到空行,这可能会中断。因此,结合istringstream 方法将是可行的方法:

string line;
while (getline(file, line))
{
    istringstream iss(line);
    char cls;
    string fullname;
    if (iss >> cls >> std::ws >> fullname)
    {
        // Note you may also want to test cls is valid (e.g. isalpha(cls))
        cout << fullname << " class: " << cls << endl;
    }
}

最后,如果您的输入是基于行的,那么作为一般偏好,您应该阅读行,然后决定实际如何处理它们。

【讨论】:

    【解决方案2】:

    您同时使用getline()&gt;&gt; 来读取文件流,但您不应该这样做。这是一个仅使用 &gt;&gt; 的示例:

    std::string cls, name, surname;
    while(file >> cls >> name >> surname) 
    {
        std::cout << name << " " << surname << " class: " << cls << std::endl;
    }
    

    我假设文件的每一行都恰好包含三个元素 - 类、名称和姓氏,因为这就是问题中的示例。如果不是这种情况,那么您真的需要使用getline() 逐行读取文件的内容,然后使用例如istringstream 解析每一行。

    此外,您同时使用了filecin,并且您的数据仅在文件中,因此您根本不需要使用cin

    【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 2015-09-22
    • 2021-11-27
    相关资源
    最近更新 更多