c ++从.csv文件中读取

时间:2013-05-08 17:24:02

标签: c++ file csv 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<< " "  ;

}

有一个csv文件(当我用记事本打开时):

0,Filipe,19,M

1,Maria,20,F

2,Walter,60,M

每当我运行程序时,控制台都会显示:

Unexpected output

我的问题是为什么程序不是在每一行重复那些cout消息而不是只在第一行中重复

是的,nome是名字,idade是年龄,genero / sexo是性别,在创建这篇文章之前忘了翻译

4 个答案:

答案 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