ifstream.fail()在open()后返回true

时间:2017-11-21 06:12:45

标签: c++

为什么fin.fail()会在以下代码中返回true

void loadName(){
    int pointer; //holds size of file
    fin.open("C:\\Users\\iAMspecial\\Desktop\\Names.txt", ios::app);
    if (fin.fail()) {
        cerr << "could not open intput file names.txt" << endl;
        system("pause"); 
        exit(1);
    }
    pointer++;
    getline(fin,Names[pointer]);
    for(int ndx = 0; !fin.eof(); ndx++){
        pointer++;  
        getline(fin,Names[pointer]);
    }
    fin.close();
    counter = pointer;
}

我在这个功能中一直在努力std::ifstream。我已经对其他问题进行了调查,即使提出了所有建议,我似乎无法使该功能正常工作。

许多问题似乎也源于Visual Studio,但我使用的是其他IDE。如果我错过了一些非常愚蠢的东西,请提前道歉。

我已经对文件路径做了双倍肯定,它是100%正确的。我真的很难过。

输出图片:

Picture of output

该计划很长,但如果其中任何其他部分与我遇到的问题相关,我很乐意发布。

(另请注意,文件路径是临时的,我只是想让函数正常工作,此时我将使用不同的文件路径)。

2 个答案:

答案 0 :(得分:3)

请改用fin.is_open()fin.fail()不用于检查流打开错误。

if (!fin.is_open()) {
    cerr << "Error: " << strerror(errno);
}

此外,逐行读取文件的正确方法是

std::string line;
while (getline(fin, line)) {
    // Do whatever with line
}

答案 1 :(得分:0)

每次失败的系统调用都会更新errno值。

如果要打印出错,可以提供更多信息:

cerr << "Error: " << strerror(errno);