web-dev-qa-db-ja.com

データの書き込み中のstd :: ofstreamでのエラー処理

文字列を初期化してファイルストリームに書き込む小さなプログラムがあります。

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
  std::ofstream ofs(file.c_str());
  string s="Hello how are you";
  if(ofs)
     ofs<<s;
  if(!ofs)
  {
       cout<<"Writing to file failed"<<endl;
  }
  return 0;
 }

私のディスク容量は非常に少なく、「ofs <」という文は失敗します。だから私はこれが論理的にエラーであることを知っています

ステートメント"if(!ofs)"では上記の問題が発生しないため、失敗した理由を知ることができません。

"ofs <が失敗したことを知ることができる他のオプションを教えてください。

前もって感謝します。

12
Santosh Sahu

私はのような解決策を見つけました

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
  std::ofstream ofs(file.c_str());
  string s="Hello how are you";
  if(ofs)
     ofs<<s;
  if(ofs.bad())    //bad() function will check for badbit
  {
       cout<<"Writing to file failed"<<endl;
  }
  return 0;
 }

以下のリンク here および there を参照して、正確性を確認することもできます。

5
Santosh Sahu

原則として、書き込みエラーが発生した場合は、badbitを設定する必要があります。エラーは、ストリームが実際に書き込みを試みたときにのみ設定されます。したがって、バッファリングのため、エラーが発生したときより後の書き込みで、またはクローズ後でも設定されることがあります。そして、ビットは「粘着性がある」ので、一度設定すると、設定したままになります。

上記を前提として、通常の手順は、クローズ後に出力のステータスを確認するだけです。最終フラッシュ後の_std::cout_または_std::cerr_への出力時。何かのようなもの:

_std::ofstream f(...);
//  all sorts of output (usually to the `std::ostream&` in a
//  function).
f.close();
if ( ! f ) {
    //  Error handling.  Most important, do _not_ return 0 from
    //  main, but EXIT_FAILUREl.
}
_

_std::cout_に出力する場合は、f.close()std::cout.flush()に置き換えます(もちろん、if ( ! std::cout ))。

AND:これは標準的な手順です。書き込みエラーがあるときに戻りコードが0(または_EXIT_SUCCESS_)であるプログラムは正しくありません。

17
James Kanze