我有一个.txt文件,看起来像这样:
Toy ball
1.25
DVD
20.00
Row Boat
1.00
第一行是项目,第二行是价格,它在接下来的两个项目中重复,以此类推。所以我的问题是,我如何将第一行放在字符串中,第二行将它放在浮点值中?这是我的代码,我正在使用structs。
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;
现在,这并没有打印出我想要的内容,struct数组只输入了第一行和第一个价格并打印出来,但其他的都说"0"。任何帮助都会很棒。谢谢各位
float
输入(顺便说一句,只需使用double
,麻烦更少)在输入缓冲区中留下一个换行符,由后续的行输入消耗。
相反,对这两行都使用getline
。
然后使用例如istringstream
将第二行转换为。。。double
,只需像从inFile
中读取一样从中"读取"即可。
除了直接修复错误之外,您还需要检查inFile
的流状态,例如通过调用其fail
成员函数。当您直接使用流对象作为条件时,它到bool
的转换会为您调用fail
,并否定结果,因此流对象本身表示"未失败"。请注意,good
是,而不是,与fail
相反,还请注意,失败状态是持久的,会导致忽略后续的输入操作。
您需要在使用输入时检查流状态。您可以通过检查getline()和运算符>>的返回值来完成此操作:
if (!getline(inFile,line))
; // oops, error, do something
if (!(inFile >> cost))
; likewise
一旦你这样做了,你会发现你的输入失败了,因为你读东西有点错误,但一旦你看到它坏了,就不难修复。