• ベストアンサー

fread()関数とfwrite()関数について

pdragonの回答

  • pdragon
  • ベストアンサー率35% (5/14)
回答No.4

質問の"サイズ"/"数値"の表現を使うと、一般には、 サイズ:オブジェクトのサイズ(バイト数) 数値:オブジェクトの個数 です。 注意すべきは、fread/fwriteは戻り値として実際に読み書きしたオブジェクトの個数を返すということです。 100Byteのcharの配列の読み書きを行う場合、 char buf[100]; int n = fread(buf, 1, sizeof buf, fp); とすると、nはsizeof bufより小さな値が返る事があり、続きから再度読み込む処理が必要になります。 int n = fread(buf, sizeof buf, 1, fp); とすると、戻り値で1(成功)か0(失敗)を判断することができます。

takuguard4
質問者

お礼

ありがとうございました!

関連するQ&A

  • fread(),fwrite()等について

    私は現在、C言語のストリームというところを勉強中で、その中でfopen()やfread(),fwrite()といった関数の使い方の例が参考書に書いてあるのですが、結果が上手く表示されず困っています。次にプログラムの説明と、ソースを載せています。 <説明> 10個の要素を持つ配列を浮動小数点数で埋め、それらをファイルに書き込み再び読み込みます。このプログラムは配列の要素を1つずつ書き込みます。 #include <stdio.h> #include <stdlib.h> double d[10] = { 10.2, 5.3, 7.91, 1.23, 7.7, 6.4, 89.12, 6.43, 5.55, 2.5 }; int main(void) { FILE *fp; int i; if((fp = fopen("myfile", "wb")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } if(fwrite(d, sizeof d, 1, fp) != 1){ printf("書き込みエラー\n"); exit(1); } fclose(fp); if((fp = fopen("myfile", "rb")) == NULL){ printf("ファイルを開くことが出来ません\n"); exit(1); } for(i = 0; i < 10; i++) d[i] = -1.0; if(fread(d, sizeof d, 1, fp) != 1){ printf("読み込みエラー\n"); exit(1); } fclose(fp); for(i = 0; i < 10; i++) printf("%f\n", d[i]); return 0; } これを実行後、myfileをテキスト形式で開くと ffffff$@333333@、p= ラ」@ョG痙ョ・ヘフフフフフ@囮劔劔@H痙ョGV@ク・Qク@333333@ @ と文字化けして表示されてしまいます。 プログラミング自体勉強するのは今回が初めてで、何がダメなのか見当が付きません。 実行時にエラーが出るわけでもありません。 長くなりましたが、解決策がお分かりの方よろしくお願いします。

  • freadの最後

    100文字くらいのファイルのファイルポインタfpがあるとして、 char ch[200]; fread(ch,sizeof(char),sizeof(ch),fp) とした場合にchの中で、ファイルの最後っていうのを判断するにはどうすればいいですか?

  • fread処理がうまくいかない!!

    バイナリエディタでfwriteで書き込んだデータは確認できたのですがfread後のデータがきちんと表示されません。 どうしてでしょうか? #include <stdio.h> void main(void) { char i[] = {'a','b'}; char j[2]; FILE *fpbin; fpbin = fopen("data","wb+"); fwrite(&i,sizeof(char),2,fpbin); fpbin = fopen("data","rb"); fread(&j,sizeof(char),2,fpbin); printf("j = %c\n", j[0]); fclose(fpbin); }

  • fwrite(3)の第2,第3引数の使い方

    man fwrite(3) を見ると、宣言は以下のようになっています。 size_t fwrite(const void *BUF, size_t SIZE, size_t COUNT, FILE *FP); 「BUF から、1つあたり SIZE byte を COUNT 個 FP に書き込む」という関数だと思うのですが、SIZE と COUNT 値はどう指定したらよいのでしょうか? たとえば、char BUF[1024] で全部書き込みたい場合に、SIZE = 1, COUNT = 1024 と指定するのと、SIZE = 4, COUNT = 256 と指定するのでは、書き込み速度や結果に違いが出るのでしょうか?

  • fread処理について

    fread処理を用いてファイルの内容を取得した後、printf("%s\n", p);で参照してみるとaaa 1 21 333 bb 24 325 6 c 7 82 98とまとめてファイルの値を取得してしまいます。この取得した値をひとつずつ分けてNODEのnameとtenに格納しようとしているのですがうまくいきません。どうすればいいでしょうか? それと、第三引数で選択した値がレコードの個数とありますがすべて選択されてしまうのどうしてでしょうか? test.txtの中身 aaa 1 21 333 bb 24 325 6 c 7 82 98 #include <stdio.h> #include <string.h> #include <stdlib.h> #include<malloc.h> typedef struct{ /*出力レイアウト*/ char name[20]; int ten[3]; }RECORD; FILE *fpbin; /*FILE構造体(グローバル変数)*/ void main(void) { RECORD *p; p = malloc(1); fpbin = fopen("test.txt","r"); fread(p,sizeof(RECORD), 1, fpbin); printf("%s\n", p); }

  • fwriteについて

    #include<stdio.h> int main(void) { FILE* fp; double f[5]={ 3.1, 2.9, 4.2, 3.7, 4.0}; double data; fp=fopen("test.txt","wb"); if(fp==NULL) { printf("text.txtが開けません。"); return 0; } fwrite(f,sizeof(double),5,fp); fclose(fp); }と入力したのでが、test.txtファイルを見ると 文字化けがでて、数値がわかりません。 数値もテキストファイルに出力する方法があったらご教授よろしくお願いします。できたらなぜこのようなことが起きたのか教えてくださるとうれしいです。

  • freadとfwrite

     C言語初心者です。 fopenでテキストファイルで読み込んで,freadやfwriteなどは使っていいのでしょうか? 入門書などでは、freadやwriteはバイナリファイルでしか使っていないので疑問になりました。

  • fwriteでの書き込み

    16進の数値をバイナリとしてファイルに書き込みたいのですが、 以下のようなプログラムで書き込んで、できたファイルを16進に 直して見てみると、  ff ff 00 00 aa ff 00 00 となっていて、途中に0000が入ってしまうのです。 16進に直して見たときに  ff ff aa ff cc 55 22 22 となるようにしたいのですが、どこがまちがっているのでしょうか? int main(void){ long *i; FILE *fp1; fp1=fopen("test.dat","w"); i[0]=0xffff; i[1]=0xffaa; i[2]=0x55cc; i[3]=0x2222; fwrite(i,2,4,fp1)); fclose(fp1); return 0; }

  • size_t

    ライブラリ関数を勉強しているのですが、 書式にたとえば callocならvoid *calloc(size_t nmemb, size_t size); という風に書いていますが、 size_tってなんですか? 書式が読めないと、、、わからないです。 あと最初にvoidと書いていますが、 返ってくるのはポインタなのだから intじゃないんですか? お願いします。

  • freadでファイルを読み込んだ際の処理時間について

    フラッシュメモリやハードディスクへファイルの書き出しをfwriteで行い、 作成したファイルをfreadを使って読み込み、その前後でclock関数を呼ぶことで 読み書きの処理時間を算出するプログラムを作成しています。 具体的には以下のような処理を行わせています。 //書き込み用のバッファを作成 buf_w = (unsigned char*)malloc(BUFSIZE); memset(buf,0,BUFSIZE); //ファイル書き込み処理 fp = fopen("ファイル名","wb"); start = clock(); fwrite(buf_w,BUFSIZE,1,fp); end = clock(); fclose(fp); //読み出し用のバッファを作成 buf_r = (unsigned char*)malloc(BUFSIZE); //ファイル読み出し処理 fp = fopen("ファイル名","rb"); start = clock(); fread(buf,BUFSIZE,1,fp); end = clock(); fclose(fp); 以上の処理にて、BUFSIZEが1GB程度の場合は問題ないのですが、 BUFSIZEを200MB程度に減らした場合に読み込み速度が ありえないほど速くなってしまうという問題が発生してしまいます。 (HDDやフラッシュメモリからの読み込みなのに転送速度が1000MB/sオーバーとか) RAMDISKとして設置したXドライブで試すと読み書き共に1200MB/sくらいになるので、 もしかしたらメモリにキャッシュされたデータを直接読み込んでしまっているのでは…… などと考えているのですが、試行錯誤すれども回避策が思い浮かびません。 どなたか、この現象について心当たりのある方がいらっしゃいましたら何かアドバイスいただけると幸いです。 宜しくお願いいたします。