我试过使用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
解析每一行。
此外,您同时使用file
和cin
,并且您的数据仅在文件中,因此您根本不需要使用cin
。