c从.csv文件中读取

我有这个代码,它应该在控制台中输入来自.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()的检查还为时过早.文件中的最后一个换行符仍然在输入流中,直到它被ID的下一个getline()调用丢弃.此时检测到文件结尾,因此检查应基于此.您可以通过将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++ 中 cin.get()、cin.getline()、getline()的用法总结


下一篇:c++常用的各类型的输入输出