4

すべてのソースを読み、このコードがそのような出力を出している理由を理解しようとしましたが、理解できませんでした。どなたか具体的な回答をお願いします。...

#include<stdio.h>

int main()
{
    FILE *fp1;
    FILE *fp2;

    fp1=fopen("abc","w");
    fp2=fopen("abc","w");

    fwrite("BASIC",1,5,fp1);
    fwrite("BBBBB CONCEPTS",1,14,fp2);

    return 0;
}

ファイル「abc」を開いたときの出力はBASIC CONCEPTSです。2 番目の fwrite がファイル「abc」の内容を上書きしないのはなぜですか? 予想される出力は BBBBB CONCEPTS である必要があります

4

2 に答える 2

3

fwrite()問題は、 unbuffered の代わりにbuffered を使用していることですwrite()。後者はカーネルに「今すぐこの内容をファイルに書き込む」ことを伝え、最初は標準Cライブラリに「適切と思われるときはいつでもこの内容をファイルに書き込む」ことを伝えます。明らかに、その標準 C ライブラリの実装は、fp2最初に からのものをフラッシュし、次に からのもので上書きしていますfp1

もちろん、fflush()自分自身を呼び出したり、実際にファイルを閉じたりすることで、正しいフラッシュ シーケンスを強制することができます。

于 2013-09-28T09:44:21.680 に答える
1

cmaster が述べたようにfopen、バッファリングされたファイル ストリームを作成します。バッファリングされたストリームは、明示的に指示されたfflush場合、またはバッファがいっぱいになった場合 (通常は約 4096 バイト) にのみデータをフラッシュします。バッファリングされたストリームに書き込んだ少量のデータでは、データがディスクにフラッシュされることはありません。

バッファリングされたストリームがまだ開いているときにプログラムが終了した場合、 (バッファリングされたストリームを実装する) libcは、GNU LibC で、最後に開いたストリームから開始して、ストリームを自動的にフラッシュします。cmaster が正しく指摘しているように、ファイルを閉じる順序は C 標準では指定されておらず、ファイルを閉じる必要があるだけです。

于 2013-09-28T10:07:40.827 に答える