2012-08-15 77 views
0

我正在編程一個控制檯C++購物清單程序,當我試圖從購物清單中刪除一個項目時,出現這個奇怪的循環錯誤。如果我試圖刪除的項目名稱不止一個單詞,它會非常快速地在此功能的主菜單結尾之間循環。控制檯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長於一個單詞時,會導致此奇怪循環。

+0

'cin'讀取直到空白。如果你想要多個單詞,使用'getline'。 – chris 2012-08-15 02:53:16

回答

2

那麼,最有可能的解決方案是,你的意思做:

getline(cin, itemToDelete); 

如果使用cin >> itemToDelete只會讀一個字。您沒有顯示deleteItem()以外的任何邏輯,因此很難評論這將會產生什麼效果。

但是,我很好奇mainMenu()函數的功能。你似乎把它稱爲好像它將從你的deleteItem()函數返回,當然它不會。你的意思是return

+0

這是一個很好的觀點。這看起來像是等待發生的堆棧溢出。 – chris 2012-08-15 02:57:13

+0

非常感謝。這解決了問題(getline)。 – Chris 2012-08-15 03:00:33

+0

'mainMenu()'實際上是函數的主菜單。我只是用它作爲函數完成時的回調函數。它不是一個回調函數,因爲我並不總是希望它返回最初調用的函數(它可能已經完全從一個單獨的函數中調用)。 – Chris 2012-08-15 03:01:52