具有重复输入的文件流

File stream with repeating input

本文关键字:文件 输入      更新时间:2023-10-16

我正在尝试创建一个重复菜单,如果程序无法打开文件,该菜单将允许用户重新输入文件名。

现在,如果我输入现有文件的名称,它可以正常工作,但如果该文件不存在,它会打印"找不到文件",然后执行程序的其余部分。我是文件流的新手,这里的大部分代码都是通过引用找到的。我有点迷茫到底发生了什么,以及处理这种情况的最佳方法是什么。任何指导将不胜感激。

typedef istream_iterator<char> istream_iterator;    
string fileName;
ifstream file;
do {        
    cout << "Please enter the name of the input file:" << endl;
    cin >> fileName;
    ifstream file(fileName.c_str());
    if (!file) {
        cout << "File not found" << endl;
    }
} while (!file);
std::copy(istream_iterator(file), istream_iterator(), back_inserter(codeInput));

构造对象后,file将始终存在,因此循环条件始终失败。将条件更改为文件是否未正确打开。

do {
...
}
while (!file.is_open())

此代码将起作用。

do {
    std::cout << "Please enter the name of the input file:" << std::endl;
    std::cin >> fileName;
    file = std::ifstream(fileName.c_str());
    if (!file) {
        std::cout << "File not found" << std::endl;
    }
} while (!file);

您的错误是文件变量有 2 个定义。while (!file)中使用的变量是在 do-while 循环外部定义的变量,默认情况下,其有效状态设置为 true。

除了@acraig5075答案:

先写一个类型,然后写一个变量名(ifstream file(就是创建一个新变量。显然你知道这一点,但是如果你在循环中再次使用相同的名称,它会创建一个新的和不同的变量。

ifstream file; // a unique variable
...
do {
    ...
    ifstream file(fileName.c_str()); // another unique variable

。因此,将循环内的用法更改为:

    file.open(fileName.c_str());