0

我正在编写一个控制台 C++ 购物清单程序,当我尝试从购物清单中删除一个项目时,我收到了这个奇怪的循环错误。如果我要删除的项目名称超过一个单词,它会在此功能的主菜单端之间快速循环。

deleteItem 函数的代码如下:

void deleteItem()
{
    string itemToDelete;
    cout << "Which item would you like to delete?" << endl;
    cin >> itemToDelete;

    iFile.open("ShoppingList.dat");
    if(!iFile.is_open()) //check that file exists
    {
        cout << "Shopping List doesn't exist! Returning to main menu." << endl;
        cin.get();
        mainMenu();
    }
    oFile.open("Transfers.dat", ios::trunc); //create and/or clear temp transfers.dat                             file
    oFile.close();
    while (!iFile.eof())
    {
        getline(iFile, newItem);
        if(newItem.compare(itemToDelete) != 0)
        {
            oFile.open("Transfers.dat", ios::app);
            oFile << newItem << endl;
            oFile.close();
        }
    }
    iFile.close();
    int result;
    remove("ShoppingList.dat"); //delete old ShoppingList.dat
    result=rename("Transfers.dat", "ShoppingList.dat"); //Rename the file with     transfered data to the Shoping List
    cout << "Success" << endl;
    cin.ignore();
    cin.get();
    mainMenu();
}

该函数的所有必要变量都已声明,并且所有必要的标头都已包含在内。这不会导致 Code::Blocks 上出现任何编译器标志,但是当itemToDelete长度超过一个单词时会导致这种奇怪的循环。

4

1 回答 1

2

好吧,最可能的解决方案是您打算这样做:

getline( cin, itemToDelete );

如果你使用cin >> itemToDelete它只会读一个字。您没有展示任何外部逻辑,deleteItem()因此很难评论这将产生什么影响。

但是,我很好奇该mainMenu()功能的作用。你似乎调用它,就好像它会从你的deleteItem()函数中返回一样,当然它不会。你不是说return吗?

于 2012-08-15T02:55:50.437 回答