3

プラットフォームは ARM 上の Ubuntu Linux です。文字列をファイルに書き込みたいのですが、毎回ファイルを切り詰めてから文字列を書き込む、つまり追加しないようにしたいです。

私はこのコードを持っています:

f=fopen("/home/user1/refresh.txt","w");
fputs( "{"some string",f);
fflush(f);
ftruncate(fileno(f),(off_t)0);
flcose(f);

実行してファイルを確認すると、ファイルの長さがゼロになり、開いたときに何もありません。呼び出しを削除するfflushと、0 ではなく (11 になります)、開くと「何らかの文字列」が含まれます。これは正常な動作ですか?の呼び出しに問題はありませんが、fflushこれをループで実行したいので、呼び出しfflushによって実行時間が大幅に長くなる可能性があります。

4

3 に答える 3

5

そのようなファイルハンドルとファイル記述子の呼び出しを実際に混在させるべきではありません。

fflush なしでほぼ​​確実に起こっていることは、some stringがファイル記述子への配信をファイル ハンドル バッファで待機していることです。次に、ファイル記述子を切り捨て、ファイル ハンドルを fclose して文字列をフラッシュすると、ファイルに表示されます。

fflush を使用するとsome stringファイル記述子に送信され、切り捨てられます。それ以上フラッシュしないと、ファイルは切り捨てられたままになります。

于 2012-11-21T13:38:33.340 に答える
2

POSIX では、FILE ストリームとファイル記述子の使用を切り替えて同じ開いているファイルにアクセスするときに、特定のアクションを実行する必要があります (バッファリングの醜い副作用によってプログラムが混乱することはありません)。これについては、XSH 2.5.1 Interaction of File Descriptors and Standard I/O Streams で説明されています。

あなたの場合、あなたがやっているように、 fflushbeforeを呼び出すだけで十分だと思います。ftruncateこのステップを省略すると、2.5.1 の規則に従って、未定義の動作が発生します。

于 2012-11-21T14:43:44.977 に答える
2

文字通り「ファイルを切り捨ててから書き込む」場合は、次のようにすれば十分です。

f=fopen("/home/user1/refresh.txt","w");
fputs("some string",f);
fclose(f);

モードでファイルを開くと、ファイルが切り捨てられます (最後に追加するためのwモードとは対照的です)。a

また、呼び出すfcloseと出力バッファがフラッシュされるため、データが失われることはありません。

于 2012-11-21T13:36:02.103 に答える