读取和分析文件,将解析的字符串的每个部分分配给其自己的变量
reading and parsing a file, assigning each piece of the parsed string to its own variable
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
______________^
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 如何通过一个循环将多个文件的内容分配给不同的类属性?
- 矢量擦除多个区域,2 x 擦除与单个分配?
- 为什么 valgrind 报告两个内存分配,而我的代码只请求一个?
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- 使用领带从元组中分配 2 个 lambda
- 将正常函数的工作分配给多个线程是否安全
- 如何有效地实现将向量的数据分配给多个变量?
- 如何为包含最多N个元素的std::multiset调用最大数量分配
- 如何在 c++ 中将两个不同类型的变量分配给一个变量
- 如何在它们之间分配和使用 2 个不同类的函数指针?
- 如何使用boost.thread运行多个接收器,每个线程应该分配给每个接收器?
- 为什么动态分配的两个变量的内存位置不是连续的?
- 为什么 new 第一次分配 1040 个额外的字节?
- 使用一个回调函数从多个订阅者分配信息
- 字符串和输入文件,从包含字符串的 txt 文件中分配多个变量值
- 如何使用一个 VirtualFree 调用删除多个相邻的虚拟内存分配?