C ++:通过fstream读取txt文件

时间:2013-12-07 03:47:33

标签: c++ arrays struct fstream

我有一个.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”。任何帮助都是极好的。谢谢你们

2 个答案:

答案 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相反,并且还注意到失败状态是持久的并导致后续输入操作被忽略。