電子書籍の厳選無料作品が豊富!

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

A 回答 (4件)

fwriteしたものならfreadでいいんでしょうが、この場合は、読み込んでいるものがテキストファイルなので、freadで読み込むのは適当ではないです。


あと
RECORD *p;
p = malloc(1);

RECORD *p;
p = (RECORD*)malloc(sizeof(RECODD));
の様にしないといけないと思います。
一行読み込みをして
sscanfなどを使ってそれぞれ変数に設定する必要があります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/09 11:41

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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/09 11:42

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 を繰り返せばよいです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/09 11:42

freadではなく、


fgetsで1行づつ読込み、
sscanfでスペース区切りの値を取得すればいいと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/09 11:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!