-4

我的代码有记忆问题,并发现我的代码被读错了。例如最后一个值是添加数字,不知道为什么。而且名字也不对。

这是输出的样子:

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

如您所见,除了最后一个值外,Empire 已正确分离。

.csv 文件

这是我的代码: 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;
}
4

1 回答 1

0

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

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

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

于 2013-08-12T04:02:20.447 回答