• ベストアンサー

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できました。

関連するQ&A

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

  • fread

    freadで、a.txtの内容を画面出力するものです。 コピーした結果、 実際のテキストにある、 !  が書き込まれませんでした。 どこが、間違っているか教えてください。 FILE *fp; char str[20];   fp=fopen("a.txt","rb");   while(!feof(fp)){      fread(&str,(sizeof(str)-1),1,fp);      if(feof(fp))            break;      printf("%s",str); }      return 0; }

  • 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@ @ と文字化けして表示されてしまいます。 プログラミング自体勉強するのは今回が初めてで、何がダメなのか見当が付きません。 実行時にエラーが出るわけでもありません。 長くなりましたが、解決策がお分かりの方よろしくお願いします。

  • fwrite処理について

    fwrite処理を行っているのですが、うまくファイルに出力されません。どこがおかしいか分からない次第です。 返答のほど、よろしくお願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> struct ll{ long int bango; char name[20]; char denwa[15]; }; FILE *fpbin; /*FILE構造体(グローバル変数)*/ struct ll *memalloc(void); void main(void) { struct ll *p; p = memalloc(); fpbin = fopen("bin","w+b"); printf("追加するNo 名前 tel >\n"); scanf("%ld %s %s", &p -> bango, p -> name, p -> denwa); printf("%ld %s %s\n", p -> bango, p -> name, p->denwa); fwrite(p,sizeof(struct ll),1,fpbin); fclose(fpbin); } struct ll *memalloc(void) { struct ll *p; if ( (p = (struct ll *)malloc(sizeof(struct ll))) != NULL ){ return p; } printf("メモリの動的割当に失敗しました。\n"); exit (1); return p; }

  • fread

    fread関数を使用し、下記のように 同じファイルに上書きしているのですが。。。。 freadで取得したデータの全角コロンを半角コロンに置き換える。 その後、全角空白を半角空白におきかえる。 そのおきかえたデータを同じファイルの上書きする。 どうもコロン(:)のところがうまく書き変えられていません。。。。 おきかえた後に、print文で出力すると置き換えられているのですが、、、 この現象がわかる方教えていただけませんか?? $body=fread(fopen($fileName, "r"),filesize($fileName)); $txt=str_replace(":", ":",$body); $txt=mb_convert_kana($txt, "s","SJIS"); $fp = fopen($fileName, "w"); chmod($fileName,0777); flock($fp, LOCK_EX); fputs ($fp, $txt); flock($fp, LOCK_UN); fclose($fp);

    • ベストアンサー
    • PHP
  • fread()エラー

    お世話になります。 今、バイナリファイルを操作しているのですが、 fread()でエラーになってしまいます。 char buf1[256]; FILE *fp; vector<string> f1; int num; fp = fopen("hoge.txt","r"); while( fgets( buf1, sizeof(buf1),fp ){ f1.push_back( buf1 ); num ++; } fclose(fp); FILE *cfp; unsigned char data[1024]; for(int i=0; i<num; i++ ){ cfp = fopen(f1[i].c_str(), "rb"); fread( data, sizeof(char), 1024, cfp ); } hoge.txtには、コンテンツ場所(パス)が複数記載されており、 その1つずつをfread()で読み込み解析したいのですが、 fread()でセグメンテーション違反になります。 f1の中味をprintf("%s",f1[0].c_str()); で見てみると正常にコンテンツの場所が格納されています。 また、 string pp = "/home/hoge/hoge.txt"; cfp = fopen(pp.c_str(), "rb"); fread(bb,sizeof(char),1024,cfp); とすると正常に動作します。 どうぞよろしくお願い致します。

  • C言語のポインタ

    あまり意識せずにポインタを使っているせいか,次のプログラムではまってしまいました. #include<stdio.h> #include<stdlib.h> int main(void) {  int *p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  printf("%d\n", *p);  return 0; } コンパイルエラーで実行ファイルが出力されません. このプログラムで変数qはなぜポインタじゃないのでしょうか? 次にtypedefでptr_intという型を定義したプログラムは, 上のようなエラーが出力されず,期待とおりの結果になりました. #include<stdio.h> #include<stdlib.h> typedef int* ptr_int; int main(void) {  ptr_int p, q;  p = (int *)malloc(sizeof(int));  q = (int *)malloc(sizeof(int));  *p = 2;  *q = 3;  printf("%d\n", *p);  printf("%d\n", *q); return 0; } typedefすることでなぜエラーを回避することができるのでしょうか? よろしくおねがいします.

  • fread関数の使い方がわかりません。

    以下のプログラムで試しているのですが、コンパイルはできても各配列の要素が表示されません。なぜなんでしょうか? #include<stdio.h> main() { FILE *fp; int i,b[10]; char a[10]; gets[a]; //ファイル名を指定 fp = fopen(a,"rb"); //バイナリモードでオープン fread(b,3,10,fp);   //配列に3byteづつ書き込んだつもり for(i=0;i>=9;i++){ printf("%02x\n",b[i]); //この部分の表示がされない。 } fclose(fp); } レベルの低い質問ですいませんがよろしくお願いします。

  • (構造体)ループ条件のscanf文が処理されない!?

    ループのscanf文を入力していないのに勝手にループの中に入って処理をしています。なぜでしょうか? #include<stdio.h> #include<malloc.h> #include<process.h> typedef struct node{ struct node *left; char name[20]; int age; struct node *right; }NODE; NODE *memalloc(void); void main(void) { NODE *head, *p, *old; /*ダミーノード作成*/ p = memalloc(); head = p; p -> left = p; p -> right = p; old = head; p = memalloc(); printf("名前 年齢入力 >"); scanf("%s, %d", p -> name, &p -> age); old -> left = p; old -> right = p; p -> left = old; p -> right = old; while(p = memalloc(), old = p, printf("名前 年齢入力 >"), scanf("%s, %d", p -> name, &p -> age) != EOF){ printf("確認\n"); old -> right = p; p -> left = old; head -> left = p; p -> right = head; } p = head -> right; while(head -> left != p -> right){ printf("名前:%20s 年齢:%5d\n", p -> name, p -> age); p = p -> right; } } NODE *memalloc(void) { NODE *ptr; if((ptr = (NODE *)malloc(sizeof(NODE))) != NULL){ return ptr; } printf("\n動的メモリ割当に失敗しました。\n"); exit(1); return(0); }

  • malloc関数の使い方について(初心者)

    膨大なデータ数を扱うためにmalloc関数を用いて配列にデータを格納し、それを表示するプログラムを考えました。コンパイルはできるのですが、実行するとエラーが起こります。freeの開放の仕方が間違っているのでしょうか?よろしくお願いします。 /*ソース*/ #include <stdio.h> #include <stdlib.h> #define N 130000 int main(void) { double *p; int i; p = malloc(N); if(!p){ printf("割り当てエラー"); exit(1); } for(i=0;i<N;i++){ p[i]=i; printf("%f\n",p[i]); } free(p); }

専門家に質問してみよう