読み書きバイナリファイル
2681 ワード
fopen,fread fwrite関数読み書きバイナリファイル問題まとめ(2011-07-17 10:53)
最近pngデータファイルを解析して、1つのファイル操作の中で無視しやすい問題を発見して、問題の説明は以下の通りです:
freadを使用してバイナリファイル(pngピクチャ)を読むと、メモリに読み込まれたデータとバイナリファイルのデータが一致しないことがわかります.同様に、fwriteを使用してバイナリファイル(pngピクチャ)を書くと、メモリに書き込まれたデータとバイナリファイルのデータとメモリのデータが一致しないことがわかります.
この問題は2日間頭が痛くて、結局とても低級な間違いを発見しました.つまり、バイナリファイルを読み書きするときは、ファイルの開く形式がバイナリ読み書きの形式で開かれていることを確認しなければなりません.すなわち、ファイルの開く形式は「rb」でなければなりません.「wb」でなければなりません.そうしないと、データを読み書きするときにエラーが発生します.
/**関数の説明:バイナリファイルを書く*パラメータの説明:file Name、ファイル名*buf、書き込むメモリバッファ.*bufLen、メモリバッファの長さ*戻り値:0,成功*−1,失敗**/int writeFile(const STR*_fileName,void*_buf,int_bufLen){FILE* fp=NULL;if(NULL=_buf|_bufLen<=0)return(−1);fp=fopen(_fileName,"wb");//if(NULL==fp){return(−1);}fwrite(_buf,__");}fwrite(_buf,__-);;//ifwrite(_buf,_buf,");////////がバイナリ書き込みの形で開いbufLen,1,fp);//バイナリfclose(fp);fp=NULL;return 0;}/*関数説明:バイナリファイルを読む*パラメータ説明:file Name、ファイル名*buf,読み出したデータ格納場所*bufLen,データの長さ情報*戻り値:0,成功*−1,失敗**/int readFile(constchar*_fileName,void*_buf,int_bufLen){FILE* fp=NULL;if(NULL=_buf|_bufLen<=0)return(−1);fp=fopen(_fileName,"rb");//if(NULL==fp){return(−1);}fread(_buf,_buf,_buffLen);}fread(_buf,_buf,_buf,_buf,_buffLen);////////ifをバイナリ読み出しの形で開くことを確認する必要Len,1,fp);//バイナリ読みfclose(fp);return 0; }
関数の使用方法の説明:
FILE * fopen(const char * path,const char * mode);
path ,
mode 。mode : r , 。 r+ , 。 rb+ , 。 rt+ , 。 w , 0, 。 。 w+ , , 。 。 a 。 , , , , 。(EOF ) a+ 。 , , , , 。 ( EOF ) wb ; 。 wb+ , 。 wt+ ; 。 at+ , 。 ab+ , 。 b , rb、w+b ab+ , b , 。 POSIX , Linux 。 fopen() S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666) , umask 。 C , C "r+","w+","a+", "rw","wr","ar" , 。 , 。 NULL, errno
, , , , fopen() 。
fread fwrite
1.関数機能データブロックを読み書きするために使用されます.
2.一般呼び出し形式
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
3.説明
(1)buffer:freadにとって、データを読み込む格納アドレスであるポインタです.fwriteにとって、データを出力するアドレスです.
(2)size:読み書きするバイト数;
(3)count:sizeバイトのデータ項目を何個読み書きするか;
(4)fp:ファイル型ポインタ.