如果先前打开失败,则ifstream.read在现有文件上失败

时间:2014-01-10 12:17:39

标签: c++ ifstream

在我的代码中,ifstream对象尝试打开一个失败的非现有文件,然后打开一个成功的现有文件。 然而,随后的读取失败。

如果在没有先前失败的情况下打开现有文件,则读取成功。

打开失败后我遗失了什么清理?

以下代码

#include <iostream>
#include <fstream>

int main(int argc, char* argv[])
{
    char *buf = new char[10];

    std::ifstream ifstr;

    ifstr.open("ExistingFile.txt", std::ios_base::in | std::ios_base::binary);
    std::cout << ifstr.is_open() << std::endl;
    ifstr.read(buf, 4);
    std::cout << ifstr.fail() << std::endl;
    ifstr.close();

    ifstr.open("NonExistingFile.txt", std::ios_base::in | std::ios_base::binary);
    std::cout << ifstr.is_open() << std::endl;
    ifstr.read(buf, 4);
    std::cout << ifstr.fail() << std::endl;
    ifstr.close();

    ifstr.open("ExistingFile.txt", std::ios_base::in | std::ios_base::binary);
    std::cout << ifstr.is_open() << std::endl;
    ifstr.read(buf, 4);
    std::cout << ifstr.fail() << std::endl;
    ifstr.close();

    return 0;
}

产生

1
0
0
1
1
1

2 个答案:

答案 0 :(得分:3)

您可能需要在ifstr.clear();之后添加ifstr.close();以清除失败位。

答案 1 :(得分:3)

你应该清除(ifstr.clear())之前的错误

如果在关闭前清除流,ifstr.close()可能会设置ifstr失败标志。如果is_open()失败,请不要关闭流