Windowsでのfwrite / freadはデータを破損する可能性があります

今日、Windows XPの標準ライブラリC fwrite / fread(msvcrt.dllバージョン7.0.2600.5512)の関数で興味深い動作エラーが発生しました。 fwriteを使用してデータ(構造)を記述し、その後すぐにfreadで記述された次のデータを読み取りました。 その結果、ファイルの最初の読み取り構造が破損しました。



解決策は、記録後にデータをディスクに強制的にフラッシュすることで見つかりました。

同じコンテンツ「12345」で2つのファイルを作成し、次のコードを実行します。



#include <stdio.h>

#include <assert.h>



int main ()

{

char byte1 = 'b' ;

char byte2 = 'b' ;

FILE * f1 = fopen ( "1" , "r+b" );

FILE * f2 = fopen ( "2" , "r+b" );



assert ( f1 != NULL );

assert ( f2 != NULL );



fseek ( f1 , 1 , SEEK_SET );

fseek ( f2 , 1 , SEEK_SET );



fwrite (& byte1 , sizeof ( char ), 1 , f1 );

fread (& byte1 , sizeof ( char ), 1 , f1 );



fwrite (& byte2 , sizeof ( char ), 1 , f2 );

fflush ( f2 );

fread (& byte2 , sizeof ( char ), 1 , f2 );



fclose ( f1 );

fclose ( f2 );

return 0 ;

}








その結果、最初のファイルの内容は「1b?45」(「?」はランダムバイト、私は0x01、友人は「H」)、2番目は「1b345」です。 ご覧のとおり、最初のファイルが破損しています。 そのため、fwrite / freadでの書き込み/読み取りには注意してください。



All Articles