这个函数请求用户通过循环输入文件名的错误在哪里?
Where is the bug in this function requesting the user to enter a file name through a loop?
下面的函数在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
,然后提取你需要的信息,从你已经读过的行。(在这种情况下,只是去掉两端的空白可能就足够了。)
相关文章:
- 从命令行c++发送文本文件名
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 2D数组来自文本输入,中间有空格
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 检查输入是否不是整数或数字
- 正在尝试了解输入验证循环
- 要求用户输入C++输出文件名
- 如何使用打印到 PDF 打印机在 MFC 和 CView 中以编程方式打印而不提示输入文件名?
- C++ 从标准输入读取文件名
- 输入文件名并读取文本
- GetSave文件名 / IFileSaveDialog - 用户输入的事件/对文件名更改做出反应?
- 如何根据用户输入指定的文件名打开文件
- 创建文件并写入,文件名是用户输入
- 如何在c++中从shell中获取作为输入重定向的文件名
- C++,如何从命令行提供输入文件名,而无需在程序中对其进行硬编码
- 用户输入文件名打开文件
- 输入文件名作为命令
- 如何使用 for 循环多次提示用户输入不同的文件名
- 这个函数请求用户通过循环输入文件名的错误在哪里?
- 从ofstream的文件名括号内输入代码值(如i从循环中输入)的c++语法