構造体データの出力でデータが化けます

このQ&Aのポイント
  • 構造体データの出力でデータが化ける現象が発生しています。
  • テスト用データをメモ帳に書き、半角スペースで区切ってデータを出力しています。
  • しかし、実行するとデータが大きな数字に化けてしまっています。どうすれば解決できるでしょうか?
回答を見る
  • ベストアンサー

構造体データの出力でデータが化けます

/* テスト用データは半角英数字で書き、半角スペースで区切ってメモ帳で書きました   Elfe 1 1 100 10 10 10 10 10 5 3 0 1 goblin 1 1 100 10 10 10 10 10 5 3 0 1 Slime 1 1 100 10 10 10 10 10 5 3 0 1 Orc 1 1 100 10 10 10 10 10 5 3 0 1 実行して表示させてみたところ大きな数字に化けます。 Elfe 7665736 7665740 7665744 7665748 7665752 7665756 7665760 7665764 7665768 766 5772 7665776 7665780 15012128  7665912 7665916 7665920 7665924 7665928 7665932 7665936 7665940 7665944 766594 8 7665952 7665956 15012128 なにがいけないのでしょうか? よろしくお願いします。 */ #include <stdio.h> #include <stdlib.h> #define MAX 10 typedef struct{// 構造体の宣言 char name[128];//プレイヤーキャラの名前 1 int loading;//ダンジョン階 2 int lv;//レベル 3 int exp;//経験値 4 int hp;//ヒットポイント 5 int mp;//マジックポイント 6 int atk;//攻撃力 7 int def;//防御力 8 int agi;//敏捷力 9 int heal;//回復量 10 int dmg;//ダメージ 11 int y;//Y座標 12 int x;//X座標 13 }player; int main(void) { int i, cnt; FILE *fp; player pc[MAX]; // 構造体配列の宣言 if( (fp = fopen( "player.txt", "r" )) == NULL ) { printf( "ファイルがオープンできません\n" ); exit( 1 ); } for( i = 0; i < MAX; ++i ) { if( fscanf( fp, "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" // 構造体配列への読み込み ,pc[i].name, &pc[i].loading, &pc[i].lv, &pc[i].exp, &pc[i].hp, &pc[i].mp, &pc[i].atk, &pc[i].def, &pc[i].agi, &pc[i].heal, &pc[i].dmg, &pc[i].y, &pc[i].x ) != 4) break; } fclose( fp ); cnt = 0; // これでテスト printf( "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" ,pc[cnt].name, &pc[cnt].loading, &pc[cnt].lv, &pc[cnt].exp, &pc[cnt].hp, &pc[cnt].mp, &pc[cnt].atk, &pc[cnt].def, &pc[cnt].agi, &pc[cnt].heal, &pc[cnt].dmg, &pc[cnt].y, &pc[cnt].x); cnt = 1; printf( "%s %d %d %d %d %d %d %d %d %d %d %d %d %d\n" ,pc[cnt].name, &pc[cnt].loading, &pc[cnt].lv, &pc[cnt].exp, &pc[cnt].hp, &pc[cnt].mp, &pc[cnt].atk, &pc[cnt].def, &pc[cnt].agi, &pc[cnt].heal, &pc[cnt].dmg, &pc[cnt].y, &pc[cnt].x); return 0; }

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

printfの"%d"と、それに対応する引数をよく考えてください。 質問に書かれてるのは以下のような事です。 int i = 0; printf("%d", &i);

Onetouch
質問者

お礼

コピペで済まそうとしたのが、ダメダメでした。 ソース書くときは、注意します。 いい勉強ができました。

関連するQ&A

  • TW テイルズウィーバー テチ 105再振り

    TW テイルズウィーバーのテチ105再振りで 補助型 LV 1 : Bonus : 50% Xien : 火炎系 INT/DEX LV 2 : AGI 極振り 2up Xien : 氷結系 INT/MR LV 3 - 6 : AGI 極振り 8up LV 7 - 8 : MR 極振り 6up LV 9 : AGI 極振り 3up LV 10 - 11 : MR 極振り 6up LV 12 : AGI * 2, MR LV 13 : MR, AGI * 2 LV 14 : AGI 極振り 3up LV 15 - 28 : DEX 極振り 22up Xien : 共通系 DEX/AGI LV 29 - 31 : MR 極振り 6up LV 32 : AGI 極振り 2up LV 33 : DEX 極振り 1up LV 34 : DEX, MR LV 35 : DEX 極振り 1up LV 36 : DEX, MR LV 37 : AGI LV 38 : AGI, MR * 2 LV 39 - 40 : AGI, MR LV 41 : AGI LV 42 : DEX, AGI LV 43 - 50 : DEX 極振り 8up LV 51 : DEX, AGI LV 52 - 60 : MR 極振り 15up LV 61 : AGI 極振り 1up LV 62 - 63 : AGI, MR LV 64 : AGI 極振り 1up LV 65 - 66 : AGI, MR LV 67 : AGI 極振り 1up LV 68 : AGI, MR LV 69 : AGI 極振り 1up LV 70 : MR, AGI LV 71 - 72 : MR 極振り 2up LV 73 - 75 : AGI 極振り 4up LV 76 : MR 極振り 1up LV 77 - 79 : AGI 極振り 4up LV 80 - 82 : MR 極振り 4up LV 83 : AGI 極振り 2up LV 84 - 88 : MR 極振り 7up LV 89 : AGI 極振り 1up LV 90 - 91 : MR 極振り 3up Xien : 白魔法 MR/INT LV 92 - 101 : MR 極振り 12up LV 102 : AGI 極振り 2up Xien : 共通系 DEX/AGI LV 103 - 105 : AGI 極振り 3up ティチエル/補助 Bonus: 52 / 104 Point: 3 LV:105 STAB 1 HACK 2 INT 34 DEF 2 MR 103 DEX 104 AGI 92 ↑が自分で何回かやって出来たいいステなのですが もう少しXとAを伸ばしたいです あとIは30でもかまいません。25↑ならOK Fは捨てました・・・Aはせめて100くらいほしいです。どなたかいい再振りレシピを教えてください。 狩り場などは適当に狩るので狩り場にあわせる気はありません。 よろしくお願いします

  • ファイル読込時に構造体の文字列ポインタに割当てたいと

    ファイル読込時に構造体の文字列ポインタに割当てたいと思っています。 (new 演算子を使用します。) 文字列の長さが不定です。 どうすれば、文字列の長さを知ることができますか? 以下のようなところまでは作れましたが、 困っています。 void loaddata()のfscanf関数の部分です。 ほかにも関数の void outputdata() void deletedata() がありますが、長いので省略しました。 ********************************************************** #include<stdio.h> #include<string.h> class data { public: struct basic { char *name; int age; struct basic *next; }; private: struct basic *base; struct basic *base_top; int cnt; public: data::data() { cnt=0; } void inputdata(char *name,int age) { if(cnt==0) { base=new basic; base_top=base; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } else { base->next=new basic; base=base->next; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } } void savedata() { base=base_top; FILE *fp; fp=fopen("dat.txt","w"); for(int i=0;i<cnt;i++) { fprintf(fp,"%s\t%d\n",base->name,base->age); base=base->next; } fclose(fp); } void loaddata() { if(cnt!=0){deletedata();} cnt=0; FILE *fp; fp=fopen("dat.txt","r"); while(1) { fscanf(fp,"%s\t%d\n",base->name,base->age); } } };

  • freadを使用した構造体に乱数を発生させ

    タイトルの通りなのですが 一度.binファイルに構造体(date)を読み書きさせ、その構造体で乱数を発生させランダムにキャラを指定の部分に表示させるプログラムなのですが、どうしても配列として扱えないのか乱数部分に(teki)を入れてもエラーになったりしてしまいます。 このプログラムで乱数→配列に代入→配列の[0][1]の取り出し→表示 は可能でしょうか。 すべて書けなかったので一部抜いています typedef struct{ char name[10]; int life; int MP; int att; int defe; }TEKI; TEKI date[20]={ {"ソリッド ",100,100, 90, 80}, {"リキッド ",100,100, 70, 80},              (略) {"マンティス ",100, 80, 70, 70}, {"ビッグ.ボス",100,100, 90, 90}, },*OFF,*DEF,MC[2],teki; srand((unsigned)time(NULL)); /*-------書き込み-------*/ //テキスト fp_txt=fopen("monster.txt","w"); if(fp_txt==NULL){return -1;} for(i=0;i<20;i++){ fprintf(fp_txt,"%s %3d %3d %3d %3d\n",date[i].name,date[i].life,date[i].MP,date[i].att,date[i].defe); } //バイナリ fp_bin=fopen("monster.bin","wb"); if(fp_bin==NULL){return -1;} fwrite(&date,sizeof(date),1,fp_bin); fclose(fp_txt); fclose(fp_bin); /*----------------------*/ fp_bin=fopen("monster.bin","rb"); if(fp_bin==NULL){ return -1; }       fread(&teki,sizeof(TEKI),21,fp_bin); /*--------乱数発生------*/ for(i=0;i<20;i++) rand_hai[i]=i; for(i=20;i>1;i--){ rnd=rand()%i; wk=rand_hai[i-1]; rand_hai[i-1]=rand_hai[rnd]; rand_hai[rnd]=wk; } sen=rand_hai[0]; kou=rand_hai[1]; MC[0]=date[sen]; MC[1]=date[kou]; /*----------------------*/ ban^=0x00000001; OFF=&MC[ban]; DEF=&MC[ban^0x00000001]; pos.X=50; pos.Y=5; SetConsoleCursorPosition(hStdout, pos); printf("[%s]",teki.name); pos.X=16; pos.Y=13; SetConsoleCursorPosition(hStdout, pos); printf("[%s]",teki.name); _getch(); fclose(fp_txt); fclose(fp_bin);

  • 構造体でのファイル操作

    1 2 3 1 2 3 1 2 3 1 2 3 みたいに書き込まれた txtデータを構造体でよみこみたいのですけどうまくいきません プログラムはこんなかんじです int i=0; FILE *fp; fp = fopen("Data.txt","r"); while (fscanf(fp, "%d,%d,%d",a.no[i],a.A[i],a.B[i] ) != EOF){ i++; } fclose(fp); a.noが1列目で a.Aが2列目で a.Bが3列目です Debug assertion failed  と表示されます どうしてでしょうか?

  • 構造体の文字列データをファイルへ書き込む方法は?

    構造体の文字列データをファイルへ書き込む方法として、構造体のデータを一気に書き込まずに、データ毎に書き込むことを勉強としてやってみようとしました。 数字の場合はうまくいったのですが、文字列の場合が分かりません。 ご存知の方、よろしくお願いいたします。 <数字の場合> typedef struct { int m1, m2; } Data; fwrite(&data[i].m1, sizeof(int), 1, fp); fwrite(&data[i].m2, sizeof(int), 1, fp); <文字列の場合> #include <stdio.h> typedef struct { char m1[10], m2[10]; } Data; int main() { static Data data[3] = { { "a1", "b1"}, { "c1", "d1"}, { "e1", "f1"}, }; Data data2[10]; FILE *fp; int i, n; fp = fopen("file.dat", "wb"); if (fp == NULL) return 1; for (i = 0; i < 3; i++) { fwrite(&data[i].m1, sizeof(Data.m1[10]), 1, fp); ← sizeofでエラーが出る fwrite(&data[i].m2, sizeof(Data.m2[10]), 1, fp); } fclose(fp); 以下省略

  • テイルズウィーバーの共通系とは?

    ステータスの再振りをしようと思い Wikiを見ながらシュミレーターを稼動してみました。 AGI転しようと思ってステを見てみたんですが LV 1 : Bonus : 50% Xien : 強化系 STAB/DEX LV 2 : DEX 極振り 1up Xien : 共通系 DEX/AGI ←ここの共通系って何!? という疑問にぶち当たりました。(共通系先行って…?) 最終的なステータスが LV:80 STAB 63 HACK 2 INT 3 DEF 22 MR 3 DEX 90 AGI 85 になればいいなというシミュなんですが… 普通に振っていったらやたらSTABが増えてしまい 確保できるDEXとAGIが減ってしまいました 場違いな上「すごく…初心者です…」という質問ですが どうやったら目標のステになるのか教えて頂けたらと思います。 ついでにキャラは81のジョシュアです。

  • テキストデータから構造体にデータを保存する方法

    C言語初心者です。 大きなテキストデータ(730MB)からデータを取得して、構造体に保存し表示するというプログラムを作成しています。テキストのサイズが大きいため構造体のサイズを400000とし、 残りをftellとfseekを使用してファイルポインタをずらして全データを順次読み込んで表示しようとしているのですが、実行すると400000行目以降(最初の構造体のMAX時点)がうまく読み込めません。 詳しい方がいましたら、ご教授願います。 #define MAX_SIZE 400000 char filename[] = ″test.txt"; struct ALL_DATA{ char cmd[10]; int addr; int bsize; }; for (int lp = 0; lp < 100; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if (lp > 0){ fseek(fp, LP, SEEK_SET); } if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", ADATA[fc].cmd, &ADATA[fc].addr, &ADATA[fc].bsize); } } LP = ftell(fp); //現在のFPの取得 printf("********** FP-> %ld *********\n", LP); fclose(fp); while (i < MAX_SIZE){ if (loopcnt == 0){ printf("ADATA[i].cmd -> %s, ADATA[i].addr -> %d, ADATA[i].bsize -> %s\n",ADATA[i].cmd, ADATA[i].addr, ADATA[i].bsize); // i++; } } 上記のような形で作成しています(一部抜粋)。 読み込むテキストデータは testA 123456 20 testA 23415 2 testB 12114567 678 のように「文字列 スペース 数字 スペース 数字」と並んでおり 値はランダムになっています。 初めて質問するため、わかりにくい記述があるかと思いますが、よろしくお願いします。

  • csvファイルを構造体に読み込みたい

    C言語初心者です。 csvファイルのデータを1行ずつ構造体に読み込みたいのですが、うまくできません。 #define MAX_SIZE 100 char filename[] = ″test.csv"; struct ALL_DATA{ int cnt; char list[10]; char addr[10]; char cmd[10]; char csize[10]; char input[10]; char icmd[10]; char input2[10]; }; for (int lp = 0; lp < 10; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%d,%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],\n", &ADATA[fc].cnt, ADATA[fc].list, ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); } } fclose(fp); while (i < MAX_SIZE){ printf("ADATA[i].cnt -> %d, ADATA[i].list -> %s, ADATA[i].addr -> %s, ADATA[i].cmd -> %s, ADATA[i].csize -> %s, ADATA[i].input -> %s, ADATA[i].icmd -> %s, ADATA[i].input2 -> %s\n",ADATA[fc].cnt, ADATA[fc].list,ADATA[fc].addr,ADATA[fc].cmd,ADATA[fc].csize,ADATA[fc].input,ADATA[fc].icmd,ADATA[fc].input2); i++; } } 読み込みたいcsvデータは 1 test 0x0012 write 0x001 yes 0xabc yes 2 testa 0x00cd read 0x024 0x1a3 のように、「数字、文字列・・・」と並んでいます。 このデータを取り込んで表示させたところ、 最初の数字は問題ないのですが、ADATA[i].addr から値がおかしくなり、 ADATA[i].addr = 0x0012write ADATA[i].cmd = write ADATA[fc].csize = 0x001yes のように、16進数を文字列として構造体に入れるときに、次の文字(英字)まで一緒に含んでしまう現象が出ております。 ネットで調べて、csvファイルから構造体に取り込む方法はいくつか見たのですが、同じようにしている(と思っている)のにうまくいかないため、質問させていただきました。 原因がわかる方がいらっしゃいましたら、アドバイスをよろしくお願いいたします。

  • プログラミング(構造体、ファイル入出力、コマンドライン引数)

    プログラミング(C言語)の質問です。 コマンドライン引数を使って3点の座標の並びが1レコードに記録されたファイルを読み込み、3点の並びが、時計回りに三角形を形作るか、反時計回りに三角形を形作るか、直線(あるいは一点)上にあるかを判定し、読み込んだ各レコードを判定に従って、3つの出力ファイル(時計回りだけのファイル、反時計回りだけのファイル、直線だけのファイル)に分配して書き込むプログラムを作成しています。しかし、なかなか完成しない上、どこが間違っているのかも分かりません。下に私が作ったプログラムを添付しておくのでどこが間違っているのか指摘してください。よろしくお願いします。 #include <stdio.h> #define BUFLEN 1024 int main(int argc, char *argv[]){ int difference_x1, difference_y1, difference_x2, difference_y2; int cross_product; char buf[BUFLEN]; struct points{ int x; int y; } point_a, point_b, point_c; FILE *fp1, *fp2; while(fgets(buf, BUFLEN, fp1) != NULL){ fp1 = fopen(argv[1], "r"); fgets(buf, BUFLEN, fp1); sscanf(buf, "%d,%d,%d,%d,%d,%d", &point_a.x, &point_a.y, &point_b.x, &point_b.y, &point_c.x, &point_c.y); difference_x1 = point_b.x - point_a.x; difference_y1 = point_b.y - point_a.y; difference_x2 = point_c.x - point_a.x; difference_y2 = point_c.y - point_a.y; cross_product = difference_x1 * difference_y2 - difference_x2 * difference_y1; if(cross_product < 0){ fp2 = fopen("clockwise.txt", "w"); }else if(cross_product > 0){ fp2 = fopen("counterclockwise.txt", "w"); }else if(cross_product == 0){ fp2 = fopen("straightline.txt", "w"); } fprintf(fp2, "%d,%d,%d,%d,%d,%d", point_a.x, point_a.y, point_b.x, point_b.y, point_c.x, point_c.y); fclose(fp2); } fclose(fp1); return 0; }

  • C言語 構造体

    以前にも構造体について質問させていただきましたが、より自由度の高い処理が必要となりご質問させていただきます。 よろしくお願いいたします。 以前のものは入力する項目数(列),行数(行)が前提にあるものでした。 テキストファイルを読み込んで、 構造体としてデータを読み込みたいのですが、 今回は項目数が不定のものです。 a.txt ------------------------- あああ,いいい,ううう ------------------------- とあれば あああ いいい ううう とカンマ抜きで得たい。(3項目) 次回読み込んだとき、 a.txt ------------------------- abc,def,g,h,i,jk ------------------------- とあれば、 abc def g h i jk とカンマ抜きで得たい。(6項目) 以前のものは下記のような感じです。 FILE *fp; FILE *file; struct seiseki seito[20]; char buf[1024]; fp = fopen("aaa.txt", "r"); i=0; while( fgets(buf, sizeof(buf), fp) ){ struct seiseki tmp; sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]); seito[i++] = tmp; } for(i = 0; i < 3; i++) { printf("%d / %s %s / %d / %d / %d / %d\n", seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2], seito[i].val[0] + seito[i].val[1] + seito[i].val[2]); }

専門家に質問してみよう