这个函数请求用户通过循环输入文件名的错误在哪里?

Where is the bug in this function requesting the user to enter a file name through a loop?

本文关键字:文件名 输入 错误 在哪里 循环 函数 请求 用户      更新时间:2023-10-16

下面的函数在Visual c++中可以正常运行,但在c++中不能。

void OpenFile(ifstream *input)
{
  string fileName = "";
  while (true) {
    cout << "Enter the filename: ";
    cin >> fileName;
    input->open(fileName.c_str());
    cin.clear();
    if (input->is_open()) break;
    cout << "The filename does not exist. Try again." << endl;
  }
}

g++中,如果用户第一次正确输入文件名,程序将执行。但是,如果用户错误地输入了文件名,该函数将提示用户输入另一个尝试,当用户在随后的尝试中输入正确的文件名时,光标将移动到下一行,程序暂停。误差是多少?同样,这在Visual C++中正常运行。

cin.clear()应该在做什么?它应该重置任何错误状态,但希望输入不是错误状态。(否则,您试图打开一个没有名称的文件。)一个未定义的文件。)

关于程序的变化行为,我怀疑是链接到系统(或库)缓冲输入的方式。的cin >> fileName通常不会返回,直到您输入换行符;但是,它不会从输入流中删除换行符。根据输入的缓冲方式,这可能会导致阻塞(尽管我认为不应该这样)。尝试循环时提示输入时,最好使用std::getline,然后提取你需要的信息,从你已经读过的行。(在这种情况下,只是去掉两端的空白可能就足够了。)