我有这段代码应该在控制台中计算出 .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()
的检查还为时过早。文件中的最后一个换行符仍然在输入流中,直到它被下一个 getline()
调用 ID
丢弃。正是在这一点上检测到文件结尾,所以检查应该基于此。您可以通过将 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()
的结果。
关于c++ 从 .csv 文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16446665/