• ベストアンサー

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); }

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

fwriteしたものならfreadでいいんでしょうが、この場合は、読み込んでいるものがテキストファイルなので、freadで読み込むのは適当ではないです。 あと RECORD *p; p = malloc(1); は RECORD *p; p = (RECORD*)malloc(sizeof(RECODD)); の様にしないといけないと思います。 一行読み込みをして sscanfなどを使ってそれぞれ変数に設定する必要があります。

yukikundesuyo
質問者

お礼

返答ありがとうございます。fwrite文で作成したバイナリファイルできちんとfreadできました。

その他の回答 (3)

回答No.4

freadで読むのであればバイナリデータのファイルを準備しましょう。バイナリエディタを使ってtest.txtというファイルを作ってください。       +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 000000 61 61 61 00 00 00 00 00 00 00 00 00 00 00 00 00 000010 00 00 00 00 01 00 00 00 15 00 00 00 4D 01 00 00 000020 62 62 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000030 00 00 00 00 18 00 00 00 45 01 00 00 06 00 00 00 000040 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 000050 00 00 00 00 07 00 00 00 52 00 00 00 60 00 00 00 ついでに、mallocやprintfの部分がおかしいです。 void main(void) { RECORD *p; p = malloc(sizeof(RECORD)); fpbin = fopen("test.txt","rb"); fread(p,sizeof(RECORD), 1, fpbin); printf("%s\n", p->name); }

yukikundesuyo
質問者

お礼

返答ありがとうございます。fwrite文で作成したバイナリファイルできちんとfreadできました。

noname#15691
noname#15691
回答No.3

fscanfを使いましょう。 void main(void) { RECORD rec; fpbin = fopen("test.txt","r"); fscanf(fpbin, "%s %d %d %d", rec.name, &rec.ten[0], &rec.ten[1], &rec.ten[2]); fclose(fpbin); printf("%s %d %d %d\n", rec.name, rec.ten[0], rec.ten[1], rec.ten[2]); } これで1行分です。 複数行読み込むときは、fscanf を繰り返せばよいです。

yukikundesuyo
質問者

お礼

返答ありがとうございます。fwrite文で作成したバイナリファイルできちんとfreadできました。

  • LemonT
  • ベストアンサー率49% (39/79)
回答No.2

freadではなく、 fgetsで1行づつ読込み、 sscanfでスペース区切りの値を取得すればいいと思います。

yukikundesuyo
質問者

お礼

返答ありがとうございます。fwrite文で作成したバイナリファイルできちんとfreadできました。