c ++从.csv文件中读取

Mr.*_*hil 15 c++ csv file 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<< " "  ;

}
Run Code Online (Sandbox Code Playgroud)

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

0,Filipe,19,M

1,Maria,20,F

2,Walter,60,M
Run Code Online (Sandbox Code Playgroud)

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

意外的输出

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

顺便说一句,nome是名字,idade是年龄,而genero/sexo是性别,在创建这篇文章之前忘了翻译

jxh*_*jxh 17

您可以按照此答案查看在C++中处理CSV的许多不同方法.

在您的情况下,最后一次调用getline实际上是将第一行的最后一个字段,然后是所有剩余行放入变量中genero.这是因为在文件结束之前没有找到空格分隔符.尝试将空格字符更改为换行符:

    getline(file, genero, file.widen('\n'));
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

    getline(file, genero);
Run Code Online (Sandbox Code Playgroud)

此外,您的检查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<< " "  ;
}
Run Code Online (Sandbox Code Playgroud)

为了更好地进行错误检查,您应该检查每次调用的结果getline().


And*_*rsK 7

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

getline(file, genero, ' ') ; 
Run Code Online (Sandbox Code Playgroud)

它是换行符\n

所以改变那条线

getline(file, genero); // \n is default delimiter
Run Code Online (Sandbox Code Playgroud)