关于c ++:如何正确读取.csv?

How to properly read from a .csv?

我的代码内存有问题,发现我的代码读错了。例如,最后一个值是加数字,不知道为什么。而且名字不太对劲。

输出结果如下:

1
2
3
4
5
6
7
8
9
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部分只是为了我个人使用,看看输入值是否正确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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<<"
"
;
        table[plu_code] = new Product(plu_code, name,by_weight, price,inventory);
        numProducts++;
    }

    return 0;
}


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

我不知道你们的Tokeniser课在这里会有什么影响。但也许可以看看这个问题,它是如何在流外标记逗号的。您可以使用带有逗号分隔符的单个getline调用来读取名称,然后使用普通的<<运算符来读取其他名称。

[编辑]事实上,在清理完你的问题布局后,我注意到Empire行不起作用。它读取行的其余部分作为名称,然后仍然输出未初始化的值。对我来说,这意味着你的Tokeniser根本不起作用。