我正在尝试使用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;
}
输出是: -
false
true
如果ifs
不是pointer
,那么它如何等于nullptr
?
答案 0 :(得分:22)
在C ++ 11之前,C ++流可以隐式转换为void*
。如果流不处于无错误状态,则结果为NULL
,如果不是,则结果为ifs == NULL
。因此,nullptr
(不应与bool
一起使用,请参阅下文)将查找并使用该转换,并且由于您的文件名错误,因此比较结果为true。
在C ++ 11中,这已更改为显式转换为false
,true
表示错误,void*
为良好的流,因为if ( !(ifs >> data) )
std::cout << "Reading data failed.";
转换允许太多无意义的代码,例如你的例子。实际上,C ++ 11或C ++ 14模式下的当前编译器将拒绝您的代码段live。由于您的代码显然至少是C ++ 11,因此您的编译器接受它是不符合的。
这些转换允许并用于错误检查,如下所示:
std::ifstream ifs ("wrong_filename.txt");
if (!ifs)
std::cout << "Could not open file.";
或者,类似于您的示例:
for (std::string line; std::getline(ifs, line);) {
// Process line
}
当天有趣的事实:您也可以使用它来干净地循环文件,例如:
#include<iostream>
using namespace std;
int main()
{
int n, sum = 0;
while(n != 0)
{
cout << "Enter number :";
cin >> n;
if(n <= 0)
break;
sum += n;
}