c++ 从 .csv 文件中读取

标签 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 是性别,发帖前忘记翻译了

最佳答案

您可以关注 this answer了解在 C++ 中处理 CSV 的许多不同方法。

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

    getline(file, genero, file.widen('\n'));

或更简洁地说:

    getline(file, genero);

此外,您对 file.good() 的检查还为时过早。文件中的最后一个换行符仍然在输入流中,直到它被下一个 getline() 调用 ID 丢弃。正是在这一点上检测到文件结尾,所以检查应该基于此。您可以通过将 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++ 从 .csv 文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16446665/

相关文章:

python - 通过文件夹/文件属性获取主机名

php - 使用 php 将希伯来语文本插入 mysql - 空白

java - CSV在java中显示日语hankaku(半角)而不是zenkaku(全角)

javascript - 将文件从 Javascript 上传到 PHP

c++ - 将 QString 从父 QT 传递给子 QT

c++ - 错误 : ‘double’ is not a class, 结构或 union 类型

c++ - Doxygen 不展开宏

c++ - 如何通过读取文件将不同数据类型的数据推送到一个 vector 中?

python - 当我尝试使用 pandas 对 csv 文件求和时,它不起作用

c++ - 确定kubernetes pod重新启动的原因