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での書き込み/読み取りには注意してください。


Source: https://habr.com/ru/post/J76042/


All Articles