fwrite処理について

このQ&Aのポイント
  • fwrite処理を行っているが、ファイルに出力されない問題が発生している。
  • 具体的な問題箇所を特定できず、対処方法が分からない。
  • メモリの動的割り当てに失敗した場合のエラーメッセージも表示される。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • yasuch
  • ベストアンサー率41% (27/65)
回答No.3

私の環境(unix)で試してみましたが、 『うまく』出力されてると思いますよ。 === 実行結果 === 追加するNo 名前 tel > 123 hoge 123-4567 123 hoge 123-4567 === ファイルの中身 === 00 00 00 7B 68 6F 67 65 00 00 31 A5 00 00 00 10 7B 03 79 80 40 00 31 C8 31 32 33 2D 34 35 36 37 00 03 7A 14 00 00 00 00 ※見やすいように、 1行目はbango 2行目はname 3行目はdenwa と害行してあります。 ※nameとdenwaのデータの後半にはゴミが入っているようです ※3行目のdenwaはアライメントされて16バイトになっています

yukikundesuyo
質問者

お礼

yasuchさんのとおり打ってバイナリエディタをよくみるときちんと表示されていました。ごみが表示されていたので間違って表示されているのかと思っていましたが違っているようでした。どうもありがとうございました。

その他の回答 (3)

  • ganzou
  • ベストアンサー率29% (25/85)
回答No.4

mallocしたらfreeしたほうがいいですよ。 使い捨てのプログラムなら別にいいけど。

回答No.2

プログラムはエラーチェックが甘いですが基本的には問題なさそうです。。。 「うまくファイルに出力されません」の具体的な現象はどんなものでしょうか?エラー表示されて止まりますか?ファイルが作成されませんか?ファイルの中身がぐちゃぐちゃですか? ファイルの内容を見る場合は、バイナリファイルですのでバイナリエディタやダンプツールで見ないとダメです。

回答No.1

まず、fopenできていますか? ファイルは作られますか? fpbinの値はNULLではありませんか?

関連するQ&A

  • fwrite文について

    char型で宣言した配列の方はうまくいきましたが、構造体を用いたfwrite文がうまく出力されません。 どうしてでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> struct ll{ char name[20]; int ten[3]; }list[3] = { {"aaa", 11}, {"bbb",22}, {"ccc",33} }; FILE *fpbin, *fpcsv; /*FILE構造体(グローバル変数)*/ void main(void) { char i[] = {'a','b'}; fpbin = fopen("data.txt","w"); //fwrite(&i,sizeof(char),2,fpbin); fwrite(&list[0].name,sizeof(struct ll),2,fpbin); fclose(fpbin); }

  • リストの削除について(構造体)

    リストの削除のプログラムを実行して行ってみると、リストの削除処理中にプログラムが終わって変更後処理がうまく表示されません。どこが間違っているかが分からないしだいです。返答のほどよろしくお願いいたします。 #include<stdio.h> #include<malloc.h> #include<string.h> struct list{ char name[20]; int age; struct list *next; }; void main(void) { struct list *head, *p, *n, *old; char key[20]; /*ダミーノード作成*/ head = (struct list*)malloc(sizeof(struct list)); old = head; while(p = (struct list*)malloc(sizeof(struct list)), printf("name age入力\n"), scanf("%s %d", p -> name, &p -> age) != EOF){ old -> next = p; old = p; } free(p); old -> next = NULL; p = head -> next; printf("変更前リスト\n"); while(p != NULL){ printf("name:%s age:%d\n",p -> name, p -> age); p = p -> next; } printf("削除key入力(name)\n"); gets(key); n = head; while(n != NULL){ old = n; n = n -> next; //printf("n -> name %s\n", n -> name); if(strcmp(n -> name, key) == 0){ printf("%s削除\n", key); //printf("n -> name %s old -> name %s\n", n -> name, old -> name); old -> next = n -> next; } } p = head -> next; printf("変更後リスト\n"); while(p != NULL){ printf("name:%s age:%d\n", p -> name, p -> age); p = p -> next; } }

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

  • c 言語初心者です。

    c 言語初心者です。 私は下記の構造体配列をつくりました。 しかしバッファオーバーランが起きてエラーが起きてしまいます。 ヒープ領域に問題があるのかもしれませんが、プログラム上どこに原因があるのかが良くわかりません。 どなたかよろしければ教えていただけないでしょうか? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include<memory.h> struct s { int i; char name[25]; char huri[25]; char num[23]; }; void touroku(struct s *p); void hyouji(struct s *p); int main(void) { struct s data; touroku( &data ); hyouji( &data ); //data.num *= 1; /* dataはポインタではないのでドット演算子 */ hyouji( &data ); return 0; } /* 構造体のメンバを設定する */ void touroku(struct s *p) { int i=0; for(i=1;i<3;i++) { printf( "25文字以内の名前を入力して下さい\n" ); memset(p[i].name, 0, sizeof(p[i].name)); fgets( p[i].name,sizeof(p[i].name) , stdin ); if(strchr(p[i].name,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].name[strlen(p[i].name)-1]=='\n')//改行解除 { p[i].name[strlen(p[i].name)-1] = '\0'; } printf("25文字以内のふりがなを入力してください\n"); memset(p[i].huri, 0, sizeof(p[i].huri)); fgets(p[i].huri,sizeof(p[i].huri),stdin); if(strchr(p[i].huri,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].huri[strlen(p[i].huri)-1]=='\n')//改行解除 { p[i].huri[strlen(p[i].huri)-1] = '\0'; } printf( "整数を入力して下さい\n" ); memset(p[i].num, 0, sizeof(p[i].num)); fgets(p[i].num,sizeof(p[i].num),stdin ); if(strchr(p[i].num,'\n')==NULL)//バッファ処理 { while(getchar() != '\n'); } if(p[i].num[strlen(p[i].num)-1]=='\n')//改行解除 { p[i].num[strlen(p[i].num)-1] = '\0'; } } } /* 構造体のメンバを出力する */ void hyouji(struct s *p) { int i=0; for(i=1;i<3;i++) printf("%-8s %3s %3s %d\n" ,p[i].name , p[i].huri , p[i].num , i); puts("----------------------------------------------------------------"); return ; }

  • (構造体)ループ条件の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); }

  • アルゴリズム 線形リスト

    最近リストについて習い始めました。入力したデータと同順に並ぶリストを作成しようと思い、コードを打ったのですが…動作中止の表示がでてしまいました。どこが間違っているのか、ずっと悪戦苦闘して組んでいるのですが、全く出口が見えてきません。何が間違えているのか、はたまた根本的に違うのか、ご指導して頂けると有難いです。 以下、コードです。 #include <stdio.h> #include <stdlib.h> #include <string.h> struct hito{ char name[20]; int age; struct hito *next; }; void main(void){ struct hito *p, *head, *dummy; char new_name[20]; int new_age; dummy = (struct hito *)malloc(sizeof(struct hito)); head = dummy; dummy->next = p; dummy = p; while (scanf("%s %d" , new_name, &new_age) != EOF) { p = (struct hito *)malloc(sizeof(struct hito)); strcpy(p->name, new_name); p->age = new_age; p->next = head; head = p; } while(p != NULL) { printf("\t%-20s %3d\n" , p->name, p->age); p = p->next; } }

  • リスト

    リスト構造にしたいのですがどうすればいいでしょうか。 #include <stdio.h> #include <stdlib.h> #include <string.h> struct toy { char name[10]; int number; struct toy next; }; /*プロトタイプ宣言*/ void omocha_toy(struct toy *x); int main( void ) { struct toy *x; if((x =(struct toy *)malloc(sizeof(struct toy))) == NULL) { fprintf(stderr,"エラー\n"); exit(1); } sprintf("x -> name,"Osarusan"); x->score = 12; omocha_toy(x); return 0; } void omocha_toy(struct toy *x) } printf("%s",x->name); printf("%d\n",x->number); } このプログラムで2つ目3つ目をリスト構造を使って作りたいんです。 お願いします。

  • 構造体宣言したポインタ変数に値を代入するには?

    strcpy(p -> key ,name);と打ってp -> key に入力した名前を格納したいのですがうまくいきません。 ほかにもp -> key = nameなども試してみましたがコンパイルエラーが出現してダメでした。 うまく格納できるやり方があれば教えてください。よろしくお願いします。 #include<stdio.h> #include<string.h> #define WORD_LENGTH 50 /* 文字列の最大長 */ typedef struct cell{ char key[WORD_LENGTH]; struct cell *next; /* 次のセルへのポインタ */ } CELL; void main(void) { char name[WORD_LENGTH]; CELL *p; printf("名前入力\n"); scanf("%s\n", name); strcpy(p -> key ,name); printf("%s\n", p -> key); }

  • 構造体の構造体 引数

    構造体の中の構造体の関数の引き渡し方法がわかりません。 下記ソースで試したのですが、うまくいきませんでした。 助言お願いいたします。 //repo.c #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #define NUM 20 #define MAX 15 struct seiseki{ float shu[3]; }; struct seito{ char name[NUM]; int age; struct seiseki kekka; }; void input(struct seito *p); void s_input(struct seiseki *p); void ss_input(struct seiseki *data); int main(){ int i; struct seito data[2]; for(i=0;i<2;i++){ printf("------------------------------\n"); printf("%d人目",i+1); input(&data[i]); } printf("%f\n",data[0].kekka.shu[0]); printf("%f\n",data[0].kekka.shu[1]); printf("%f\n",data[0].kekka.shu[2]); //data[1]に格納できない。 printf("%f\n",data[1].kekka.shu[0]); printf("%f\n",data[1].kekka.shu[1]); printf("%f\n",data[1].kekka.shu[2]); return 0; } void input(struct seito *p){ printf("名前->"); scanf("%s",p->name); printf("年齢->"); scanf("%d",p->age); s_input(&(p->kekka)); } void s_input(struct seiseki *data){ printf("国語->"); ss_input(data); printf("算数->"); ss_input(data); printf("英語->"); ss_input(data); } //下記関数で成績をchar型で受け取り、数値化したい。 void ss_input(struct seiseki *data){ char p[100]; int i=0; static int o=0; scanf("%s",p); while( p[i] != '\0'){ if(isdigit(p[i])==0){ printf("再入力してください"); scanf("%s",p); } i++; } data->shu[o]=atof(p); printf("%f\n",data->shu[o]); o++; }

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