2017-07-27 19 views
3

ファイルに書き込む1つの方法は、fprintf()を使用することです。ただし、この関数は結果をファイルに即時に書き込みません。。むしろ、プログラムが終了したり終了したときに、すべてを一度に書き込むようです。すぐにfprintf()を書き込む方法

私の質問は次のとおりです:実行に非常に時間がかかるプログラムがあります(大きなデータセットの場合は4-5時間です)。この間、私は中間結果を見て、5時間待たなくてもいいです。私の大学は仕事の提出にSun Grid Engineを使用しています。ほとんどの人が知っているように、あなたの仕事が終わるまで待って、最終結果を見る必要があります。したがって、中間結果をテキストファイルに書き込んで、プログラムが処理しているときに更新結果を確認できるようにしたいと思います(同様にprintfを使用している場合)。

fprintf()を変更して、欲しいものを書くにはどうすればすぐにを対象ファイルに追加できますか?

+6

M.M @ 'fflush'機能 –

+0

を使用する前にこの機能を見ていません。 – Medo

+0

ありがとうございます[Cの自動フラッシュ標準出力バッファのルールとは何ですか](https://stackoverflow.com/q/39536212/2410359)。 – chux

答えて

7

各書き込みの後にfflush関数を使用して、出力バッファをディスクにフラッシュすることができます。あなたはPOSIXシステム(つまりLinuxでは、BSDなど)を使っているのであれば

fprintf(fileptr, "writing to file\n"); 
fflush(fileptr); 

、そしてあなたが本当には、ファイルがディスクに書き込まれていることを確認したいが、あなたにも、カーネルのバッファをフラッシュしたい。すなわちユーザ空間のバッファとして、またfsyncを使用します。

fsync(fileno(fileptr)); 

しかしfflushは十分なはずです。必要がない限り、fsyncを気にしないでください。

+0

本当に!それは簡単! – Medo

+0

ありがとうございます。よく説明されています。 – Medo

+0

'fsync'はPOSIXだけではありませんか? – stackptr

0

にfflush
これは* FILEで動作します。あなたの場合、それはより適切に見えます。 fflush(NULL)は開いているすべてのファイル/ストリームを更新し、CPUを集中的に使用することに注意してください。パフォーマンス上の理由から、fflush(NULL)を使用する/避けることをお勧めします。
のfsync

これは、int型の記述に取り組んでいます。これは、ファイル/ストリーム、メタデータも更新するだけでなく、システムクラッシュ/リブートの場合でも同様に動作します。詳細はmanページで確認できます。

私は個人的にはfflushを使用しています(Ubuntu/Linux)。

0

多分FILEポインタ_IONBFモードを設定することができます。それから、fflushやfsyncを使用しないでクラウド化します。 FILE * pFilePointor = fopen(...); setvbuf(pFilePointor、NULL、_IONBF、0);

のfprintf(...) fprintfの(...)

関連する問題