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

C++: Reading txt file through fstream

本文关键字:txt 文件 读取 fstream 通过 C++      更新时间:2023-10-16

我有一个.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

一旦你这样做了,你会发现你的输入失败了,因为你读东西有点错误,但一旦你看到它坏了,就不难修复。