Closing C++ File Stream is not Opened

梦想的初衷 提交于 2019-12-12 02:47:25

问题


Suppose you declare an instance of std::ifstream or std::ofstream but is_open() returns 0

Example:

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

Since the file never opened, do I still need to call file.close() after the printf statement?


回答1:


No, you can only close an open file (similar to how you cannot close an already closed door - there is nothing to be done).

Extra note: Please do not combine the C I/O library (Xprintf family of functions) with the C++ I/O library (iostreams).

Consider using code like this:

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

Edit (reasons not to use C IO API and C++ IO API together):

  • Using both APIs imposes synchronization between them, with priority towards the C API (i.e. the C api remains as fast, but IO streams will become slower, due to synchronization requirements).

  • It is inconsistent, using two very different concepts/abstraction levels for the same task. In more complex code, you will have to write twice the error handling (they impose different styles of error handling in client code), have both their limitations and combine their bad aspects (C API is prone to buffer overflows/security issues on reading and fails silently, unless you pay lots of attention to writing/maintenance of each API call, C++ API calls can be verbose).

They do not need to be particularly close (or far) appart, it is simply a bad programming practice.

This is similar to using a generic ODBC C API for reading table1 of your database, and ActiveX Data Objects for reading table2 in the same database, and the same program, or using Qt for your development, then hacking over it with raw WinAPI calls: you have twice the problems to solve (and many times end up implementing the solution to the same problems twice).



来源:https://stackoverflow.com/questions/24487381/closing-c-file-stream-is-not-opened

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!