from: http://blog.csdn.NET/zhtsuc/article/details/2938614
關於C++ fstream的一個容易使用出錯的地方
關於c++ 中 文件流的兩個類,ifstream 和ofstream,大家也許並不陌生。
其負責c++的文件輸入流 和 文件輸出流。基本上所以語言都會提供類似的文件輸入流 和文件輸出流類。
但當大家學習了Java,或者c#后,大家就很容易用錯這個類,把三種語言混淆。
在java 和 c#中,關於打開輸入文件流,或者輸出流,都是通過拋出異常來標志打開失敗。
而且大家對這種思想也很容易接受。
所以在c++中如下的錯誤使用很是常見。
- try
- {
- ifstream fin("filename");
- //TODO:
- }
- catch(exception)
- {
- cout << "fail to open file" << endl;
- }
其實c++的ifstream,ofstream和c#,java的文件流類在這一點上並不相同。
當文件打開失敗或者其他錯誤時,並沒有異常拋出。那讀者就會想,“如何判斷文件打開成功呢”。
因為肯定要確定文件打開成功,才能操作文件流對象。
如下為一般的正確使用方法。
- ifstream fin("filename");
- if (!fin)
- {
- cout << "fail to open the file" <<endl;
- return -1;//或者拋出異常。
- }
- else
- {
- cout << "open the file successfully" << endl;
- }
這時候有人又有疑問了。fin是一個ifstream對象,不可能是0,或者NULL啊。怎么會有!fin的這個判斷語句成功呢。
正如我們所以疑問的,!fin並不是說判斷fin是否為0或者為空。而是ifstream類重載了!操作符,所以當我們如此使用的時候,是!操作符函數返回一個bool變量來標記是否成功。
類似的對於ofstream也是如此。
其實在c++中,很多類都是通過重載操作符來完成一些轉化的。讀者可以常常留意。
other: http://blog.csdn.net/seadplus/article/details/7802346