1

C++ に次のようなものがあるとします。

ofstream myfile;
myfile.open (argv[1]);

if (myfile.is_open()){
 for(int n=0;n<=10;n++){
     myfile << "index="<<n<<endl;
     sleep(1);
 }
}else{
cerr << "Unable to open file";
}

myfile.close();

また、書き込み中は、書き込み先のディスクまたはメディアが使用できなくなりますが、close() のために再びオンになるため、その間にデータが失われます。または、USB フラッシュ ドライブに書き込みを行い、書き込み処理中にデバイスが取り外され、再度挿入されたと想像してください。どうすればそれを検出できますか?書き込みをtry {} catch、flags()、rdstate()に入れてみましたが、名前を付けましたが、これまでのところ機能していないようです。

4

4 に答える 4

1

私見あなたが試すことができる:

  1. ios:exceptionsを使用する
  2. 低レベルの OS 対話を使用する
  3. IO が成功したことを確認します (1 と 2 が機能しない場合)
于 2011-11-04T16:26:10.333 に答える
1

それはstdioレベルで検出できるものではないと思います。通常、ハード ドライブが一時的に応答を停止すると、オペレーティング システムは、コマンドが成功するかタイムアウトになるまでコマンドを自動的に再試行します。タイムアウトになると、システム コールがエラーを受け取る可能性があります。(データがメモリ内ファイルシステム キャッシュに書き込まれた後、コマンドが実際のディスクに送信される前に、呼び出しが既に返されている可能性があるため、そうではない可能性があります)

フレーク ハード ドライブを本当に検出したい場合は、おそらく、独自のハードウェア ドライバーを作成するなど、はるかに低いレベルでコードを作成する必要があります。

于 2011-11-04T16:19:52.570 に答える
0
for(int n=0;n<=10;n++){
    if (!(myfile << "index="<<n<<endl))
        throw std::runtime_error("WRITE FAILED")
    sleep(1);
}

std::ostreamが何らかの理由で失敗した場合、状態ビットが設定されます。これはチェックstd::streamされ、ブール値のコンテキストになります。std::istreamこれは、変数へのデータの読み込みが正しく行われた かどうかを確認するのと同じ方法です。

rdstate()ただし、これはあなたが試したと言う と同じです。その場合、書き込みはバッファに到達しています。 endlプログラムのバッファをフラッシュする は、それがオペレーティング システムのバッファにあることを示しています。そこから、OS 固有の呼び出しを使用して、強制的にバッファをフラッシュする必要があります。

[編集] http://msdn.microsoft.com/en-us/library/17618685(v=VS.100).aspxによると_commit、ファイル記述子がある場合は強制的にフラッシュできます。s のような保証は見つかりませんstd::ostream

于 2011-11-04T16:27:10.970 に答える
0

これがあなたのシナリオ(書き込み中にUSBドライブを取り外す)をカバーするかどうかはわかりませんが、ストリームで例外を有効にしてみることができます:

myfile.exceptions(ios::failbit | ios::badbit);

私の経験では、iostream は、エラーとエラーの種類を検出するのを困難にするという「素晴らしい」仕事をします。

于 2011-11-04T16:25:23.313 に答える