我正在编写一个控制台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 :(得分:2)
嗯,最可能的解决方案就是你打算这样做:
getline( cin, itemToDelete );
如果您使用cin >> itemToDelete
,则只会读取一个字。你没有在deleteItem()
之外显示任何逻辑,所以很难评论它会产生什么影响。
但是,我对mainMenu()
函数的作用感到好奇。你似乎把它称为它将从你的deleteItem()
函数返回,当然它不会。你的意思是return
吗?