我正在编写一个程序,我允许用户指定要打开的输入文件,当我使用不正确的文件名进行测试时,程序表现得非常奇怪,似乎与输入缓冲区有关,但我除了使用getline()
代替cin >>
之外,我不知道从哪里开始,但我已经尝试过了。
这里是我认为可能是问题的代码:
bool openfile(ifstream&);
string userInput();
int main()
{
// ...
while (!openfile(inputFile))
openfile(inputFile);
string input = userInput();
// ...
}
bool openfile(ifstream &inputFile)
{
string filename;
cout << "Please enter the name of the file or type quit to exit the program: ";
cin >> filename;
cout << endl;
if (filename == "quit")
exit(4);
else
inputFile.open(filename);
if (!inputFile)
{
cout << "The file \"" << filename << "\" could not be opened or does not exist.\n";
return false;
}
return true;
}
string userInput()
{
string englishSentence;
cout << "Please enter a sentence or type quit to exit the program: \n";
getline(cin, englishSentence);
if (englishSentence == "quit")
exit(4);
return englishSentence;
}
这是读取任何输入的两个函数。首先调用openfile()
,你可以看到。任何帮助是极大的赞赏。如果您在我的代码中怀疑其他内容我会粘贴它,请告诉我。
答案 0 :(得分:0)
你可以这样做:
while (!openfile(inputFile));
由于你拥有它的方式,如果它第一次失败,它会请求两次输入文件名。
基本上要概述问题:
答案 1 :(得分:0)
我从您的代码中看到的一些问题:
int main(); { ... }
未定义main
函数。你需要删除分号,否则它甚至不会编译。while (!openfile(inputFile)) openfile(inputFile);
不必要地重复openfile(inputFile)
。如果第一个(在条件中)失败并且第二个(在正文中)成功,则将进行第三次调用(在条件中)以检查循环是否应该继续。你可能想要的只是while (!openfile(inputFile)) { }
。openfile
中打开了一个文件,但从未在随后的userInput
中使用该文件。答案 2 :(得分:0)
while (!openfile(inputFile))
openfile(inputFile);
这样做是为了尝试每次迭代打开文件两次,只要第一次尝试失败。此外,您需要确保inputFile
在尝试再次打开之前已关闭,因为您似乎重复使用相同的文件对象。
当然首先尝试类似:
while (!openfile(inputFile))
;