我有这个代码,它应该在控制台中输入来自.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是性别,在创建这篇文章之前忘了翻译答案 0 :(得分:16)
您可以按照this answer查看在C ++中处理CSV的许多不同方法。
在您的情况下,对getline
的最后一次调用实际上是将第一行的最后一个字段,然后是所有剩余的行放入变量genero
。这是因为在文件结束之前没有找到空格分隔符。请尝试将空格字符更改为换行符:
getline(file, genero, file.widen('\n'));
或更简洁:
getline(file, genero);
此外,您对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<< " " ;
}
为了更好地进行错误检查,您应该检查每次调用getline()
的结果。
答案 1 :(得分:7)
csv文件就像任何其他文件一样是一个字符流。 getline从文件读取到分隔符但是在你的情况下,最后一个项目的分隔符不是“你假设的”
getline(file, genero, ' ') ;
是换行符\ n
所以将该行更改为
getline(file, genero); // \n is default delimiter
答案 2 :(得分:2)
您的csv格式不正确。输出不是三个循环而是一个输出。 要确保这是一个单循环,请添加一个计数器并在每个循环中递增它。它应该只计为一个。
这是您的代码所看到的
0,Filipe,19,M\n1,Maria,20,F\n2,Walter,60,M
试试这个
0,Filipe,19,M
1,Maria,20,F
2,Walter,60,M
while(file.good())
{
getline(file, ID, ',');
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero) ; \\ diff
cout << "Sexo: " << genero;\\diff
}
答案 3 :(得分:-2)
那是因为你的csv文件格式无效, 也许你的文本文件中的换行符不是\ n或\ r
和, 使用c / c ++解析文本不是一个好主意。 试试awk:
$awk -F"," '{print "ID="$1"\tName="$2"\tAge="$3"\tGender="$4}' 1.csv
ID=0 Name=Filipe Age=19 Gender=M
ID=1 Name=Maria Age=20 Gender=F
ID=2 Name=Walter Age=60 Gender=M