c ++ getline() 似乎无法正常运行,直到最后才读取该行



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

D 姓名 姓氏

名字2 姓氏2

学生人数不详。

输出应如下所示:

名称 姓氏类:D

姓名2 姓氏2类:A

但是我的产量是这样的:

名称类 A

乌尔纳姆 S 类

名称2 E 类

乌尔纳姆2 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;
}
}



看起来你已经尝试了各种各样的事情来使这项工作,包括在循环中间读取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;
}
}

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

您同时使用getline()>>从文件流中读取,您不应该这样做。下面是一个仅使用>>的示例:

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

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

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

相关内容

最新更新