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

C++ C++;:通过fstream读取txt文件,c++,arrays,struct,fstream,C++,Arrays,Struct,Fstream,我有一个.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++) { strin

我有一个.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;
}
const int TOTAL_ITEMS=3;
对于(int itemNumber=0;itemNumber>成本;
列表[itemNumber]。价格=成本;
}
然后我打印列表:

for (int itemNumber = 0; itemNumber < TOTAL_ITEMS; itemNumber++) {
    cout << itemNumber << ": " << list[itemNumber].item <<  " " << list[itemNumber].price << endl;
for(int itemNumber=0;itemNumbercout在使用输入时,您需要检查流状态。您可以通过检查getline()和操作符>>的返回值来做到这一点:

if (!getline(inFile,line))
    ; // oops, error, do something

if (!(inFile >> cost))
    ; likewise

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

浮动输入(顺便说一句,只要使用
双精度输入,麻烦就少了)在输入缓冲区中保留一个换行符,该换行符由后续的行输入使用

相反,对这两行使用
getline

然后使用例如
istringstream
将第二行转换为…
double
,只需以与从
infle
读取相同的方式“读取”



除了直接修复bug之外,您还需要检查
infle
的流状态,例如通过调用其
fail
成员函数。当您直接使用流对象作为条件时,它向
bool
的转换将为您调用
fail
,并对结果求反,以便流对象本身表示“不要失败"。请注意,
good
fail
并非相反,还请注意,失败状态是持续的,会导致后续输入操作被忽略。

我能够设置断点,以查看程序一步一步地输入什么,我认为问题在于,当程序接受价格时,它不会跳到下一个line.所以它读“玩具球”,然后读“1.75”,但它在“1.75”后面有一行,这是“”,因为下一行有“DVD”正确。我不太清楚你怎么会不太清楚我的意思——我给了你逐字记录的代码来检查你需要检查的错误。让你的代码看起来更像我的代码,然后运行你的程序,你就会检测到错误。你的代码只是告诉我哪里有错误。我知道哪里有错误。我的问题是我不知道我知道有什么问题,我的问题很简单,我该如何解决?仅供参考,使用getline和stringstream将行转换为数字的这种解决方案的性能相当差。只使用fscanf会快一点,或者getline后面跟着strtod。@JohnZwinck:谢谢你的评论。我知道
fscanf
,谢谢,仅供参考,由于可能存在未定义的行为(或者我认为这是一个主要原因),C++11的iostream i/o被重新定义为不再以
fscanf
的形式指定.因此,我真的很犹豫是否向新手推荐该功能,因为我也决不会试图让新手专注于低水平的性能(相反,为新手提供服务,则相反)。但谢谢你。我相信这是出于好意,只是出于无知。