C ++程序中的奇怪行为

时间:2015-02-24 18:37:41

标签: c++ input

我正在编写一个程序,我允许用户指定要打开的输入文件,当我使用不正确的文件名进行测试时,程序表现得非常奇怪,似乎与输入缓冲区有关,但我除了使用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(),你可以看到。任何帮助是极大的赞赏。如果您在我的代码中怀疑其他内容我会粘贴它,请告诉我。

3 个答案:

答案 0 :(得分:0)

你可以这样做:

while (!openfile(inputFile));

由于你拥有它的方式,如果它第一次失败,它会请求两次输入文件名。

基本上要概述问题:

开始循环

  • 申请文件名
  • 文件名无效
    • 请求替换文件名
    • 返回循环开始(再次检查)

答案 1 :(得分:0)

我从您的代码中看到的一些问题:

  1. int main(); { ... }未定义main函数。你需要删除分号,否则它甚至不会编译。
  2. while (!openfile(inputFile)) openfile(inputFile);不必要地重复openfile(inputFile)。如果第一个(在条件中)失败并且第二个(在正文中)成功,则将进行第三次调用(在条件中)以检查循环是否应该继续。你可能想要的只是while (!openfile(inputFile)) { }
  3. 您在openfile中打开了一个文件,但从未在随后的userInput中使用该文件。

答案 2 :(得分:0)

while (!openfile(inputFile))
      openfile(inputFile);

这样做是为了尝试每次迭代打开文件两次,只要第一次尝试失败。此外,您需要确保inputFile在尝试再次打开之前已关闭,因为您似乎重复使用相同的文件对象。

当然首先尝试类似:

while (!openfile(inputFile))
      ;