如何正确读取.csv?

时间:2013-08-12 03:45:07

标签: c++ csv

我的代码存在内存问题,并且发现我的代码读错了。例如,最后一个值是添加数字,不确定原因。这些名字也没有说出来。

这就是输出的样子:

4101,BRAEBURN02.07682e-3172.07691e-317
4021,DELICIOUS02.07682e-3172.07691e-317
4020,DELICIOUS02.07682e-3172.07691e-317
4015,DELICIOUS02.07682e-3172.07691e-317
4016,DELICIOUS02.07682e-3172.07691e-317
4167,DELICIOUS02.07682e-3172.07691e-317
4124,EMPIRE,1,1.14,145.202.07682e-3172.07691e-317
4129,FUJI02.07682e-3172.07691e-317
4131,FUJI02.07682e-3172.07691e-317

正如你所看到的那样,除了最后一个值之外,帝国已正确分开。

csv file

这是我的代码:cout部分仅供我个人使用,以查看值是否正确输入。

int main()
{
    string name;
    double price;
    int by_weight;
    double inventory;
    int plu_code;
    ifstream infile;
    infile.open("inventory.csv"); 

    while(!infile.eof())
    {    
        stringstream ss;
        string line = "";
        getline(infile,line);

        Tokenizer tok(line, ",");
        ss << line;

        ss >> plu_code >> name >> by_weight >> price >>inventory;
        cout << plu_code<<"" <<name<<"" << by_weight<<"" << price <<""<<inventory<<"\n";
        table[plu_code] = new Product(plu_code, name,by_weight, price,inventory);
        numProducts++;
    }

    return 0;
}

1 个答案:

答案 0 :(得分:0)

Empire行有效,因为它是唯一一个名称不包含空格的行。当您从流中读取字符串时,它们由空格分隔,因此您只能获得第一个单词。如果之后有更多单词,则读取double或其他数字类型将失败,因为该流仍指向非数字字符。您没有测试输入操作是否成功,但是从输出中可以明显看出。

我不确定你的Tokeniser班级应该在这里产生什么影响。但也许可以查看this SO question以便在流中标记逗号。您可以使用带有逗号分隔符的单个getline调用来读取名称,然后使用普通<<运算符来查找其他名称。

[编辑]事实上,在清理问题布局后,我注意到Empire行不起作用。它正在读取行的其余部分作为名称,然后仍然输出未初始化的值。这告诉我你的Tokeniser根本没有做任何事情。