我正在尝试使用打开文件失败的测试程序ifstream.代码如下: -
#include <iostream>
#include <fstream>
#include <type_traits>
using namespace std;
int main()
{
ifstream ifs ("wrong_filename.txt");
cout << boolalpha;
cout << is_pointer<decltype(ifs)>::value <<"\n";
cout << (ifs==nullptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是: -
false
true
Run Code Online (Sandbox Code Playgroud)
如果ifs不是pointer,那它又怎么样nullptr?
Bau*_*gen 22
在C++ 11之前,C++流可以隐式转换为void*.结果将是NULL流不处于无错状态而其他情况如果是.所以ifs == NULL(不应该使用nullptr,见下文)将找到并使用该转换,并且由于您的文件名错误,比较将产生真.
在C++ 11中,这被改为显式转换bool,false指示错误和true良好的流,因为void*转换允许太多无意义的代码,例如您的示例.实际上,C++ 11或C++ 14模式下的当前编译器将拒绝您的实时代码片段.由于您的代码显然至少是C++ 11,因此您的编译器通过接受它是不符合要求的.
这些转换允许并用于错误检查,如下所示:
if ( !(ifs >> data) )
std::cout << "Reading data failed.";
Run Code Online (Sandbox Code Playgroud)
或者,类似于您的示例:
std::ifstream ifs ("wrong_filename.txt");
if (!ifs)
std::cout << "Could not open file.";
Run Code Online (Sandbox Code Playgroud)
有趣的事实:您也可以使用它来干净地循环文件,例如:
for (std::string line; std::getline(ifs, line);) {
// Process line
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1286 次 |
| 最近记录: |