假设您声明了std::ifstream
或std::ofstream
的实例,但is_open()
返回0
示例:
std::ifstream file("myfile.txt");
if (!file.is_open()) {
printf("Could not open file\n");
return;
}
由于文件从未打开过,我还需要在file.close()
声明后调用printf
吗?
答案 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调用:你有两倍的问题需要解决(很多时候最终会针对同样的问题两次实现解决方案)。