我有这个代码,它应该在控制台中输入来自.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<< " " ;
}
还有一个csv文件(当我用记事本打开时):
0,Filipe,19,M
1,Maria,20,F
2,Walter,60,M
每当我运行程序时,控制台都会显示:
我的问题是为什么程序不是在每一行中重复那些cout消息而不是仅在第一行中重复
顺便说一句,nome是名字,idade是年龄,而genero / sexo是性别,在创建这篇文章之前忘了翻译
解决方法:
您可以按照this answer查看在C中处理CSV的许多不同方法.
在你的情况下,最后一次调用getline实际上是将第一行的最后一个字段,然后是所有剩余的行放入变量genero中.这是因为在文件结束之前没有找到空格分隔符.尝试将空格字符更改为换行符:
getline(file, genero, file.widen('\n'));
或者更简洁:
getline(file, genero);
此外,您对file.good()的检查还为时过早.文件中的最后一个换行符仍然在输入流中,直到它被ID的下一个getline()调用丢弃.此时检测到文件结尾,因此检查应基于此.您可以通过将while测试更改为基于ID本身的getline()调用来解决此问题(假设每行都格式正确).
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<< " " ;
}
为了更好地进行错误检查,您应该检查每次调用getline()的结果.