关闭C ++文件流未打开

时间:2014-06-30 09:52:56

标签: c++ file-io ifstream ofstream

假设您声明了std::ifstreamstd::ofstream的实例,但is_open()返回0

示例:

std::ifstream file("myfile.txt");
if (!file.is_open()) {
    printf("Could not open file\n");
    return;
}

由于文件从未打开过,我还需要在file.close()声明后调用printf吗?

1 个答案:

答案 0 :(得分:2)

不,你只能关闭一个打开的文件(类似于你不能关闭已经关闭的门的方式 - 没有什么可做的。)

额外注意:请不要将C I / O库(X printf系列函数)与C ++ I / O库(iostreams)结合使用。

考虑使用这样的代码:

std::ifstream file("myfile.txt");
if (!file.is_open()) {
    std::cerr << "Could not open file\n";
    return;
}

编辑(不同时使用C IO API和C ++ IO API的原因):

  • 使用这两个API会强制它们之间的同步,优先考虑C API(即C api保持同样快,但由于同步要求,IO流会变慢)。

  • 它是不一致的,对同一任务使用两个非常不同的概念/抽象级别。在更复杂的代码中,您必须编写两次错误处理(它们在客户端代码中强加不同的错误处理方式),同时具有它们的局限性并结合它们的不良方面(C API在读取时容易出现缓冲区溢出/安全问题)无声地失败,除非你非常注意编写/维护每个API调用,C ++ API调用可能是冗长的。)

他们不需要特别接近(或远)appart,这只是一个糟糕的编程习惯。

这类似于使用通用ODBC C API读取数据库的table1,使用ActiveX数据对象读取同一数据库中的table2,使用相同的程序,或者使用Qt进行开发,然后使用原始数据进行黑客攻击WinAPI调用:你有两倍的问题需要解决(很多时候最终会针对同样的问题两次实现解决方案)。