【问题标题】:C++ File Parser with multiple values具有多个值的 C++ 文件解析器
【发布时间】:2014-11-30 08:59:38
【问题描述】:

我正在尝试编写打开 csv 文件并从一行读取多个输入的 C++ 代码。所以csv文件的数据类型格式为:

整数、字符串、整数、整数

我想要做的是像这样一次将所有这些读入一个变量

ifstream myfile;
myfile.open("input.csv");
string a;
int b, c, d;
while (myfile.is_open() && myfile.good())
{
    if(myfile >> b >> a >> c >> d)
         cout << a << " " << b << " "  << c << " "  << d << " " ;
    myfile.close();
}

但是当我运行我的代码时,它只是跳过if 行并转到.close() 行。没有任何东西被打印出来。我认为它无法读取这些值。

我的代码有什么问题?为什么它不能读取这些值?

【问题讨论】:

  • 不是问题的根本原因,但不要像that那样编写读取循环。

标签: c++ file parsing csv ifstream


【解决方案1】:

执行以下操作以从 正确 格式化的 csv 文件中提取令牌。

#include <sstream>
// ....

std::string line ;

while ( std::getline( myfile, line ) )
{

     std::stringstream buffer( line );
     std::string token;

     while( std::getline( buffer, token, ',' ) )
    {
       // std::cout << token << std::endl;
       // convert to int, etc
    }
}

【讨论】:

    【解决方案2】:

    但是当我运行我的代码时,它只是跳过 if 行并转到 .close() 行。没有任何东西被打印出来。我认为它无法读取这些值。

    这是因为从 CSV 文件中读取第二个字段时出错。您没有在代码中执行任何操作来在读取数据时跳过逗号 (,)。

    您可以使用不同的策略来读取数据。我的建议:

    1. 逐行读取文件。
    2. 使用',' 作为分隔符将行划分为标记。
    3. 使用std::istringstream 将每个令牌转换为您希望看到的数据。

    【讨论】:

    • 这仍然不起作用。我什至用简单的if(myfile&gt;&gt;timestamp) 尝试过它仍然没有读取任何内容。
    • @Richard,第一个不是上帝的建议。试试更新后的建议。
    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 2015-03-09
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多