C ++文件读取问题

时间:2015-05-15 20:14:29

标签: c++ file getline

尝试使此代码正常运行时遇到问题。这是我的文字文件:

Raisin Bran
3.49
300
Milk
1.49
200
White Bread
2.49
100
Butter
2.49
100
Grape Jelly
1.09
50

这是我的代码的一部分:

    inFile >> tempy;
    grocery_items[k].set_item_name(tempy);
    inFile >> temp;
    grocery_items[k].set_item_price(temp);
    inFile >> stock;
    grocery_items[k].set_qty_on_hand(stock);

出于某种原因,它只读出了#34; raisin"和之后的数字。这是因为第一行有两个单词,而不是一个单词,而我的inFile一次只有一个单词。如果我将这两个单词组合成一个单词,整个代码就可以正常工作(例如,Raisin Bran成为RaisinBran)。有没有办法让我能够做到这一点,而不是一言不发?

当我将第一行转为getline(inFile, tempy)时 第一行打印,但数字只是一遍又一遍地重复。

2 个答案:

答案 0 :(得分:4)

您的问题是混合std::getline()operator>>。这通常会导致问题,因为一个人移除了新行而另一个人离开了新行。

问题1:

inFile >> tempy;  // Only reads one word.

解决方案使用std :: getline

std::getline(inFile, tempy);

问题2

std :: getline()函数假定您位于该行的开头。当你从第一行开始时,这适用于第一条记录。

但是因为您使用operator>>来阅读这些数字,所以会留下尾随的' \ n'在输入流上。因此,在阅读前两个数字3.49300之后,您将获得一个' \ n'在strem。

流看起来像这样:

\nMilk\n1.49\n200\nWhite Bread\n2.49...(etc)

如果您知道尝试使用std :: getline()读取下一个项目(Milk)的名称,您将在tempy中获得一个空值(因为输入中的下一个字符是一个新行,所以它认为tou有一个空行只是删除了'\n')。下一次读取尝试读取一个数字,但如果找到的是字符串Milk,则会使流处于错误状态,并且它将拒绝读取更多值。

简单的解决方案。读完读取的第二个数字后,丢弃其余部分。

grocery_items[k].set_qty_on_hand(stock);
std::string skip
std::getline(inFile, skip);          // Note: there is a istream::ignore
                                     //       But I would have to look up the
                                     //       exact semantics (I leave that to
                                     //       you).

更好的解决方案:不要混用std::getline()operator>>。将每一行读入一个字符串,然后解析该字符串(可能使用stringstream)。

std::string  numberString;
std::getline(inFile, numberString);
std::stringstream numberStream(numberString); // Might be overkill here.
numberStream >> tempy;                        // But it will work. Also look
                                              // at std::atoi()

下一步

删除set函数并为Inventory类编写自定义operator>>

答案 1 :(得分:0)

尝试使用带getline()的字符串而不是数组。

int main() {
   string line;
   if (getline(cin,line)) {
      //your code
   }
}