我的代码存在内存问题,并且发现我的代码读错了。例如,最后一个值是添加数字,不确定原因。这些名字也没有说出来。
这就是输出的样子:
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
正如你所看到的那样,除了最后一个值之外,帝国已正确分开。
这是我的代码: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;
}
答案 0 :(得分:0)
Empire
行有效,因为它是唯一一个名称不包含空格的行。当您从流中读取字符串时,它们由空格分隔,因此您只能获得第一个单词。如果之后有更多单词,则读取double
或其他数字类型将失败,因为该流仍指向非数字字符。您没有测试输入操作是否成功,但是从输出中可以明显看出。
我不确定你的Tokeniser
班级应该在这里产生什么影响。但也许可以查看this SO question以便在流中标记逗号。您可以使用带有逗号分隔符的单个getline
调用来读取名称,然后使用普通<<
运算符来查找其他名称。
[编辑]事实上,在清理问题布局后,我注意到Empire
行不起作用。它正在读取行的其余部分作为名称,然后仍然输出未初始化的值。这告诉我你的Tokeniser
根本没有做任何事情。