Mr.*_*hil 15 c++ csv file getline
我有这个代码,它应该在控制台中输入来自.csv文件的信息;
while(file.good())
{
getline(file, ID, ',');
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero, ' ') ;
cout << "Sexo: " << genero<< " " ;
}
Run Code Online (Sandbox Code Playgroud)
还有一个csv文件(当我用记事本打开时):
0,Filipe,19,M
1,Maria,20,F
2,Walter,60,M
Run Code Online (Sandbox Code Playgroud)
每当我运行程序时,控制台都会显示:

我的问题是为什么程序不是在每一行中重复那些cout消息而不是仅在第一行中重复
顺便说一句,nome是名字,idade是年龄,而genero/sexo是性别,在创建这篇文章之前忘了翻译
jxh*_*jxh 17
您可以按照此答案查看在C++中处理CSV的许多不同方法.
在您的情况下,最后一次调用getline实际上是将第一行的最后一个字段,然后是所有剩余行放入变量中genero.这是因为在文件结束之前没有找到空格分隔符.尝试将空格字符更改为换行符:
getline(file, genero, file.widen('\n'));
Run Code Online (Sandbox Code Playgroud)
或者更简洁:
getline(file, genero);
Run Code Online (Sandbox Code Playgroud)
此外,您的检查file.good()还为时过早.文件中的最后一个换行符仍然在输入流中,直到它被下一次getline()调用丢弃ID.此时检测到文件结尾,因此检查应基于此.您可以通过将while测试更改为基于对自身的getline()调用来解决此问题ID(假设每条线都已经很好地形成).
while (getline(file, ID, ',')) {
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero);
cout << "Sexo: " << genero<< " " ;
}
Run Code Online (Sandbox Code Playgroud)
为了更好地进行错误检查,您应该检查每次调用的结果getline().
csv文件就像任何其他文件一样是一个字符流.getline从文件读取到分隔符,但在您的情况下,最后一项的分隔符不是'',因为您假设
getline(file, genero, ' ') ;
Run Code Online (Sandbox Code Playgroud)
它是换行符\n
所以改变那条线
getline(file, genero); // \n is default delimiter
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
111137 次 |
| 最近记录: |