关于c++ fstream的一个容易使用出错的地方。

关于c++ 中 文件流的两个类,ifstream 和ofstream,大家也许并不陌生。

其负责c++的文件输入流 和 文件输出流。基本上所以语言都会提供类似的文件输入流 和文件输出流类。

 

但当大家学习了java,或者c#后,大家就很容易用错这个类,把三种语言混淆。

在java 和 c#中,关于打开输入文件流,或者输出流,都是通过抛出异常来标志打开失败。

而且大家对这种思想也很容易接受。

 

所以在c++中如下的错误使用很是常见。

  1. try
  2. {
  3.   ifstream fin("filename");
  4.   //TODO:
  5. }
  6. catch(exception)
  7. {
  8.   cout << "fail to open file" << endl;
  9. }

其实c++的ifstream,ofstream和c#,java的文件流类在这一点上并不相同。

当文件打开失败或者其他错误时,并没有异常抛出。那读者就会想,“如何判断文件打开成功呢”。

因为肯定要确定文件打开成功,才能操作文件流对象。

如下为一般的正确使用方法。

 

  1. ifstream fin("filename");

  2. if (!fin)
  3. {
  4.   cout << "fail to open the file" <
  5.   return -1;//或者抛出异常。
  6. }
  7. else
  8. {
  9.   cout << "open the file successfully" << endl;
  10. }

这时候有人又有疑问了。fin是一个ifstream对象,不可能是0,或者NULL啊。怎么会有!fin的这个判断语句成功呢。

正如我们所以疑问的,!fin并不是说判断fin是否为0或者为空。而是ifstream类重载了!操作符,所以当我们如此使用的时候,是!操作符函数返回一个bool变量来标记是否成功。

 

类似的对于ofstream也是如此。

 

其实在c++中,很多类都是通过重载操作符来完成一些转化的。读者可以常常留意。

 

 

你可能感兴趣的:(C++)