使用getline提供额外输出的功能

时间:2014-10-01 19:52:47

标签: c++ arrays loops ifstream

所以我从我的一个程序中获得了这个功能,之前它给了我所有这些(-9.25596e + 061)并且只有第一行。但后来我把{','在我的getline中,让它打印整个文件,但仍然得到数字(这是一个内存转储吗?)

void getMenuFromFile(ifstream& inFile, menuItemType menu[], int menuSize) {
    for (int i = 0; i < menuSize; i++) {
        getline(inFile, menu[i].menuType, ',');
        inFile >> menu[i].menuPrice;
        inFile.ignore();
    }
}

输入:

Plain Egg            $1.45
Bacon and Egg        $2.45
Muffin               $0.99
French Toast         $1.99
Fruit Basket         $2.49
Cereal               $0.69
Coffee               $0.50
Tea                  $0.75

输出:

Plain Egg            $1.45
Bacon and Egg        $2.45
Muffin               $0.99
French Toast         $1.99
Fruit Basket         $2.49
Cereal               $0.69
Coffee               $0.50
Tea                  $0.75
-9.25596e+061

-9.25596e+061

-9.25596e+061

-9.25596e+061

-9.25596e+061

-9.25596e+061

-9.25596e+061

-9.25596e+061
Press any key to continue . . .

2 个答案:

答案 0 :(得分:1)

您的代码存在许多问题:

  • 您告诉std::getline停在',',但您的输入不包含任何内容。因此,它在第一次调用时会占用整个文件。最后,您打算使用'$'代替?

  • 之后,提取价格和所有其他行的尝试失败。您会注意到是否要检查流的状态,如

    if (!inFile) { cerr << "damn it!\n"; }
    
  • 即使问题得到解决,您仍然无法在int中存储1.45和所有其他价格。也许你想要float代替?

你的输出是这样的:

首先,您会看到进入menu[0].menuType的文件的全部内容。对于所有剩余的条目,您将得到一个空的(默认构造的)字符串和碰巧在内存中的随机垃圾值(因为int s未进行值初始化)。

更新:在审核完输出后,我怀疑menuItemType::menuPriceint,正如您在评论中所说的那样。它不是floatdouble吗?上述其他问题仍然存在。

答案 1 :(得分:0)

void showMenu(menuItemType menu[], int menuSize)
{


    for (int i = 0; i < menuSize; i++)
    {
        cout << menu[i].menuType << endl;
        //cout << menu[i].menuPrice << endl;
    }


}

谢谢@AndyG,我可能发布了错误的功能,但是你让我指出问题是来自哪里。为了摆脱额外的数字,我评论了第二个cout,这是不需要的。

输出

Plain Egg            $1.45
Bacon and Egg        $2.45
Muffin               $0.99
French Toast         $1.99
Fruit Basket         $2.49
Cereal               $0.69
Coffee               $0.50
Tea                  $0.75