我有一个.txt文件,如下所示:
Toy ball
1.25
DVD
20.00
Row Boat
1.00
第一行是商品,第二行是价格,然后重复下两个商品,依此类推。所以我的问题是如何把第一行放在一个字符串中,第二行放在浮点值中?这是我的代码,我正在使用结构。
const int TOTAL_ITEMS = 3;
for (int itemNumber = 0; itemNumber < TOTAL_ITEMS; itemNumber++) {
string line;
getline(inFile,line);
list[itemNumber].item = line;
float cost;
inFile >> cost;
list[itemNumber].price = cost;
}
然后我打印清单:
for (int itemNumber = 0; itemNumber < TOTAL_ITEMS; itemNumber++) {
cout << itemNumber << ": " << list[itemNumber].item << " " << list[itemNumber].price << endl;
现在这不打印我想要的东西,结构数组只接受第一行和第一个价格并打印出来,但其他人都说“0”。任何帮助都是极好的。谢谢你们
答案 0 :(得分:0)
您需要在消耗输入时检查流状态。您可以通过检查getline()和operator&gt;&gt;的返回值来执行此操作:
if (!getline(inFile,line))
; // oops, error, do something
if (!(inFile >> cost))
; likewise
一旦你这样做,你会发现你的输入失败了,因为你读的东西有些不正确,但是一旦看到它被打破了,就不难修复。
答案 1 :(得分:0)
float
输入(顺便说一句,只需使用double
,减少麻烦)在输入缓冲区中留下一个换行符,后续行输入会使用该换行符。
相反,请对两行使用getline
。
然后使用例如istringstream
将第二行转换为... double
,只需按照您从inFile
读取的内容“阅读”。
除了直接错误修复,您还需要检查inFile
的流状态,例如通过调用其fail
成员函数。当您直接使用流对象作为条件时,它转换为bool
为您调用fail
,并否定结果,以便流对象本身表示“不会失败”。请注意,good
不与fail
相反,并且还注意到失败状态是持久的并导致后续输入操作被忽略。