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でコンパイラフラグが発生することはありませんが、がitemToDelete1ワードより長い場合、この奇妙なループが発生します。

4

1 に答える 1

2

まあ、最も可能性の高い解決策は、あなたがやろうとしていたことです:

getline( cin, itemToDelete );

使用cin >> itemToDeleteすると、1 単語だけが読み取られます。外部のロジックを示していないdeleteItem()ため、これがどのような影響を与えるかについてコメントするのは困難です.

しかし、私はmainMenu()関数が何をするのか興味があります。関数から返されるかのように呼び出すようですがdeleteItem()、もちろんそうではありません。そうじゃないreturn

于 2012-08-15T02:55:50.437 に答える