c++文件读取问题



试图使此代码工作有问题。这是我的文本文件:

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);

由于某些原因,它只读取单词"raisin"和后面的数字。这是因为第一行有两个单词,而不是一个,而且我的inFile每次只处理一个单词。如果我将这两个单词组合成一个单词,整个代码就可以正常工作(例如,RaisinBran变成RaisinBran)。有没有一种方法可以让我做到这一点,而不是把所有的东西都变成一个词?

当我把第一行变成getline(inFile, tempy)第一行打印,但是数字只是一遍又一遍地重复。

你的问题是你混合了std::getline()operator>>。这通常会导致问题,因为一个人删除了新行,而另一个人留下了它。

问题1:

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

解决方案使用std::getline

std::getline(inFile, tempy);

问题2

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

但是因为您使用operator>>来读取这些数字,所以在输入流上留下尾随的'n'。因此,在读取了前两个数字3.49300之后,您在流中留下了'n'。

流如下:

nMilkn1.49n200nWhite Breadn2.49...(etc)

如果你知道试着用std::getline()读取下一个项目(Milk)的名称,你将在tempy中得到一个空值(因为输入的下一个字符是一个新行,所以它认为你有一个空行,只是删除了'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>>

尝试使用getline()字符串代替数组。

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

相关内容

  • 没有找到相关文章

最新更新