21

我有这段代码,它应该在控制台中从 .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 是性别,创建这篇文章之前忘记翻译了

4

4 回答 4

25

您可以按照此答案查看在 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()

于 2013-05-08T17:51:46.473 回答
9

csv 文件就像任何其他文件一样是一个字符流。getline 从文件读取到分隔符,但是在您的情况下,最后一项的分隔符不是您假设的 ' '

getline(file, genero, ' ') ; 

这是换行符\n

所以将该行更改为

getline(file, genero); // \n is default delimiter
于 2013-05-08T18:14:59.070 回答
4

您的 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


}
于 2013-05-08T17:37:27.603 回答
-5

那是因为您的 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
于 2013-05-08T17:47:15.677 回答