读取和分析文件,将解析的字符串的每个部分分配给其自己的变量

reading and parsing a file, assigning each piece of the parsed string to its own variable

本文关键字:分配 个部 变量 自己的 字符串 文件 读取      更新时间:2023-10-16
89   int Student::loadStudents() {
90   Student newStudent;
91   string comma;
92   string line;
93   ifstream myfile("student.dat");
94   string name,email="";
95   string status="";
96   int id;
97   if (myfile.is_open()){
98     while ( getline (myfile,line) ) {
99         //parse line
100         string myText(line);
101         istringstream iss(myText);
102         if(!(iss>>id)) id=0;
103
104         std::ignore(1,',');
105         std::getline(iss,name,',');
106         std::getline(iss,status,',');
107         std::getline(iss,email,',');
108         cout<<name<<endl;
109         Student newStudent(id,name,status,email);
110         Student::studentList.insert(std::pair<int,Student>(id,newStudent));

以上是我定义的方法。执行 cout 时,输出为:

无名氏

马特·史密斯

在我添加第二个 getline(iss,name,',')之前,cout 什么也没做。

谁能解释为什么它适用于重复的行以及为什么相同的代码不适用于状态和电子邮件?

文件中的示例行:

1,约翰·doe,freshman,jd@email.com

编辑:

我在第一个 getline(iss,name,',') 之前使用了 std::ignore(1,','),并收到错误"忽略"在此命名空间"std"中未声明。

谁能解释为什么它适用于重复的行以及为什么相同的代码不适用于状态和电子邮件?

因为您对isa的第一次操作是iss>>id.

大概您的输入文件的形式是id,name,status,email.第一个操作读取但不包括第一个逗号。第一个逗号仍在输入流中。这意味着您的第一个std::getline(iss,name,',')会读取第一个逗号和第一个逗号之前剩余的所有内容。在第一个逗号之前剩下的所有东西 - 这是一个空字符串。

最好不要混合分析概念。沿逗号拆分行,然后分析每个拆分的元素。


编辑
解决此问题的另一种方法:呼叫std::ignore而不是第一次呼叫std::getline。要读取的下一个字符应该是逗号,因此请忽略它。如果您可以假定输入文件的格式正确,则可以这样做。如果您必须处理人类创建的变幻莫测的输入文件,这是不行的。

另一个问题:假设某人的名字是"John Doe,PhD"或电子邮件地址是"John Doe,PhD"?


编辑 2
为了澄清,假设该行包含"1234,John Doe,新生,jdoe@college_name.edu"。

iss>>id之前的输入指针:
1234,John Doe,freshman,jdoe@college_name.edu
^
iss>>id的调用将id设置为 1234,并将输入指针前进到第一个非数字字符 - 第一个逗号。

iss>>id之后的输入指针(第一次调用std::getline之前):
1234,John Doe,freshman,jdoe@college_name.edu
____^看到
输入指针的第一个std::getline(iss,name,',')是逗号。它将name设置为空字符串,并将输入指针前进到逗号之后。

第一次调用std::getline之后(第二次调用std::getline之前)的输入指针:
1234,John Doe,freshman,jdoe@college_name.edu
_____^
第二个std::getline(iss,name,',')读取第二个逗号。它将name设置为"John Doe"空字符串,并将输入指针前进到第二个逗号之后。

第二次调用std::getline后(第三次调用std::getline之前)的输入指针:
1234,John Doe,freshman,jdoe@college_name.edu
______________^

相关文章: