• ベストアンサー

ファイルのデータを構造体に入力したいのですが・・・

2002 Chicago Adrien Brody The Pianist Nicole Kidman The hours 2001 A Beautiful Mind Denzel Washington Training Day Halle Berry Monster's Ball 2000 Gladiator Russell Crowe Gladiator Julia Roberts Erin Brockovich ・ ・ ・ fopenでこのようなファイルのデータを取り込み、 構造体に格納したいのですが どうすればいいのでしょう・・・

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

  • ベストアンサー
回答No.2

構造体をどう設計しているか不明なので適切な答えができませんね。。。 とりあえず、適当なサンプルです。(データを入れたファイルのファイル名はdata.txt) #include <stdio.h> #include <string.h> #include <ctype.h> #define NAME_SIZE 40 #define DATA_SIZE 100 struct academy {  int year;  char picture[NAME_SIZE];  char actor[NAME_SIZE];  char actor_cast[NAME_SIZE];  char actress[NAME_SIZE];  char actress_cast[NAME_SIZE]; } data[DATA_SIZE]; int main(void) {  char buf[100];  int cnt,i;  FILE *fp;  if ((fp=fopen("data.txt","r"))==NULL) {   printf("file open error\n");   return -1;  }  for (cnt=0; cnt<DATA_SIZE; cnt++) {   do {    if (fgets(buf,sizeof buf,fp)==NULL) goto INPUT_SKIP; /* 1行読む。ファイル終端なら二重ループから出る */   } while(isdigit(buf[0])==0); /* 先頭文字が数字以外なら次の行 */   sscanf(buf,"%d",&data[cnt].year);   if (fgets(buf,sizeof buf,fp)==NULL) break;   strncpy(data[cnt].picture,strtok(buf,"\n"),NAME_SIZE-1);   if (fgets(buf,sizeof buf,fp)==NULL) break;   strncpy(data[cnt].actor,strtok(buf,"\n"),NAME_SIZE-1);   if (fgets(buf,sizeof buf,fp)==NULL) break;   strncpy(data[cnt].actor_cast,strtok(buf,"\n"),NAME_SIZE-1);   if (fgets(buf,sizeof buf,fp)==NULL) break;   strncpy(data[cnt].actress,strtok(buf,"\n"),NAME_SIZE-1);   if (fgets(buf,sizeof buf,fp)==NULL) break;   strncpy(data[cnt].actress_cast,strtok(buf,"\n"),NAME_SIZE-1);  } INPUT_SKIP:  printf("%d件読み込みました\n",cnt);  for(i=0; i<cnt; i++) {   printf("%d\n[%s]\n[%s]\n[%s]\n[%s]\n[%s]\n\n",    data[i].year,data[i].picture,data[i].actor,data[i].actor_cast,data[i].actress,data[i].actress_cast);  }  fclose(fp);  return 0; }

その他の回答 (1)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

>どうすればいいのでしょう・・・ と言われても・・・ というのが多くの人の感想です。 まずは何がわからないのか整理してください。 質問をする前に、わからなくてもいいので自分の思った通りにプログラムを書いてみましょう。 その上でコンパイルが通らなかったり、プログラムを実行して期待通りの動きをしなかったら質問しましょう。

関連するQ&A

  • ファイル入力のデータを構造体に入れる方法

    VB.net(XP:VS2008のみフルインストール)にて テキストファイルから入力したデータを構造体st_testに入れたいと考えているのですが、実現できません。 どなたか、お力添えをお願いします。 テキストファイルは、事前に構造体(st_test)に値を入れ、 単純にFileOpen→OutPutしています。 (","や" "などでメンバ毎に分割等はしておりません。) 構造体 ---------------------- Public Structure st_test <VBFixedArray(63), MarshalAs(UnmanagedType.ByValArray, SizeConst:=64)> _ Dim A() As Byte Dim B As Integer <VBFixedArray(7), MarshalAs(UnmanagedType.ByValArray, SizeConst:=8)> _ Dim N() As Byte <VBFixedArray((7), (11)), MarshalAs(UnmanagedType.ByValArray, SizeConst:=(72))> _ Dim S(,) As Byte <VBFixedArray(11), MarshalAs(UnmanagedType.ByValArray, SizeConst:=12)> _ Dim U() As Integer End Structure ---------------------- 実現しようとしている個所 ---------------------- Dim t As String Dim temp(2) as st_test FileOpen(1, "test1.txt", OpenMode.Input) Input(FileNum, t) '''temp(0) = CType(CType(t, Object), st_test)...? temp(0) = CType(t, st_test) | FileOpen(1, "test2.txt", OpenMode.Input) Input(FileNum, t) temp(1) = CType(t, st_test) ---------------------- 上記の様に処理を行えば簡単にできるのかと安易な発想でいましたが、 CTypeの処理で'String'の値を'st_test'に変換できません。 旨のエラーになり、うまく実現することができません。 そもそもString型のデータをst_testにキャストすることが不可能なのでしょうか? それともただ、実現方法がカスなのでしょうか? 実際の構造体のサイズは4000Byteを超え(メンバ数も多いです。。。) 一つ一つ入力していくことが現実的に不可能なため ファイルよりInputすることしか思いついておりません。 test1.txtの中身を秀丸で開いてみました。 参考になれば・・・。 改行はなく、"福岡"の後等にそれぞれ空白があります。 -------------------------- 福岡 . A1 14 15 16 17 18 19 XX XX XX XX XX XX -------------------------- 宜しくお願いします。

  • 読み込んだデータを構造体に割り当てる

    構造体を作り、for ループをつかってそれぞれの行列に、fscanf を使ってデータを読み込み、出力した所、データは適当な行列に入っているのを確認しました。その直後、別のfor ループで出力してみたところ、行列のデータは違うものになっていました。 具体的にコードを書くと、 for(j = 0; j < 2; ++j){ for(k = 0; k < 2; ++k){ fscanf(my_stream, "%d", &my_array[j][k]); printf("1: my_array[%d][%d] = %d?n", j, k, my_array[j][k]); } } この出力は以下のように、予想したのとあっているものでした。 1:my_array[0][0] = 1 1:my_array[0][1] = 2 1:my_array[1][0] = 3 1:my_array[1][1] = 4 その直後、 for(j = 0; j < 2 ++j){ for(k = 0; k < 2; ++k){ printf("2: my_array[%d][%d] = %d?n", j, k, my_array[j][k]); } } で出力した所 2:my_array[0][0] = 3 2:my_array[0][1] = 4 2:my_array[1][0] = 3 2:my_array[1][1] = 4 このようになっていました。 もし分かる方がいらっしゃったら、アドバイスよろしくお願い致します。とても困っています。

  • csvファイルのデータを構造体に

    csvファイルのカンマを数えて任意の文字列を抜き出すまでは出来たのですがそこから構造体に格納するまでがこちらのサイトでも検索しましたがよくわかりません。 ご指摘のほどよろしくお願いします。 csvデータ 番号,名前,住所,電話,年齢,性別 1,佐藤,東京,1234,33,A 2,田中,,5678,22, 3,坂井,名古屋,,,B ・ ・ 番号,住所,電話,年齢を格納する場合 struct k_data { char no[4];/* 出来れば番号を右詰めにしたい */ char add[20]; int tel; int age; } kaiin[256]; /* 文字列を抜き出す↓ */ int main(void) { FILE *fp1,*fp2; char dat[256]; char *ch; int cnt; /* fp1 ファイルオープン */ /* fp2 ファイルクローズ */ while (fgets(dat, 256, fp1) != NULL) { cnt = 0; for (ch = dat; *ch != '\0'; ch++) { if (*ch ==',') { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc('\n', fp2); } cnt++; } else { if (cnt == 0) { putc(*ch, fp2); } if (cnt == 2) { putc(*ch, fp2); } if (cnt == 3) { putc(*ch, fp2); } if (cnt == 4) { putc(*ch, fp2); } } } putc('\0', fp2); } fclose(fp2); fclose(fp1); }

  • ファイルから読み込んだデータを構造体に格納できますか?

    1レコード19バイトのファイルを 読み込む処理を行っています。 地区名10バイト 県名8バイト 改行1バイト このデータをdouken(構造体)に格納したいのですが >while (fgets(dou,19,fp) != NULL){ で、エラーになってしまいます。 どのようにしたら ファイルから読み込んだデータを 構造体に格納できますか? #include<stdio.h> #include <stdlib.h> struct douken { char tiku[10]; char ken[8]; } main(void){ FILE *fp; struct douken dou[100]; int i; fp = fopen("ex3.fil","rb"); if ( fp == 0 ){ printf("can't open\n"); exit(1); } while (fgets(dou,19,fp) != NULL){ ・ ・ ・

  • ヤフーで変に訳される英語;;

    簡単な英文なんですが・・・急いで訳さなければいけないので、ヤフーの通訳をさっき使いました・・・;;けど変んな日本語に訳されてしまいます; よかったら、訳してほしいです・・・;;; You are very kind to lend me this book. It very kind of you to lend me this book. The train ran over a man and his horse that were just crossing the trank. Each of the boys gets a prize. We should keep in mind that man is a part of nature. I might have visited the museum If I had gone to Chicago last week. The teacher enjoys working with his students. She told me that her uncle was coming the next day. You are taller than I by two inches. He came along with his hands in his pockets. 本気でおねがいします・・・・;;

  • ファイルのデータを構造体に代入する方法

    学習し始めてから時間が経ちましたが、まだ初心者のまま・・・少しずつ頑張っている状態の者です。 今回はタイトルのことで御質問させてください。 関数Read(自己作成)でcsvファイルの内容を読み取り、読み取ったデータを用意しておいた構造体の変数ポインタを利用して代入しようと試みているのですが・・・要領がつかめません。 それで気になったのですが、読み込んだファイルを用意しておいた構造体に入れるにはどんな方法があるかよろしければご教授下さい。 私としてはforを使ったやり方があるのなら是非見本を見せてほしいのですが・・・ ちなみに、私が考えていたプログラム案は以下の通りです。 構造体にはcsvファイル・1レコード分の情報が入る構成。 構造体と読み取るファイルの構造は酷似しているが構造体全てに入る情報でない場合がある。 構造体には必要な分、配列領域を確保する ファイルの先頭アドレスはファイルポインタに代入。 構造体の先頭アドレスはポインタ変数に代入。   main関数とは別の関数の引数に2つのアドレスをコピー。 ★ そこでファイルデータを構造体へ代入しmainに戻って出力する。    その関数での戻り値は特になし(成功したら0・・・と考えていたのですが使い道が今のところはreturnだけです) ★で特に悩んでいるので、よろしくお願い致します。

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

    /* テスト用データは半角英数字で書き、半角スペースで区切ってメモ帳で書きました   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; }

  • 構造体でデータをやり取り出来ないか

     みなさん、こんにちは。質問させて頂きます。  関数に変数を渡すとき、変数のポインタを渡す方法が有ります。  この方法なら呼ばれた関数が、呼び出した関数の変数を直接操作出来ます。  これを構造体で出来ないでしょうか。  下記のプログラムで実験しました。(2)の所を色々と書き換えて試したのですが、エラーになります。  (1)は、エラーになりません。エラーで無く(2)の様に使えなければ、(1)の p はどのような使い道が有るのでしょう。 /*-----------------------------*/ struct Par { long a ; } ; /*-----------------------------*/ void sub1( struct Par *p )  ・・・(1) エラーにならない { p.a = 2 ;   ・・・(2) 色々変えて試しても、エラーになる }

  • テキストデータと構造体。

    テキストデータを構造体に代入し、キャッシュの仕組みの様に見せるプログラムをC言語で作れますか? 教えて下さい。ちょっと緊急です…

  • 構造体の構造体の構造体をまとめて初期化したい

    gnuplotをCで吐くためのプログラムを作成していますが、 構造体の構造体の構造体をまとめて初期化することができません。 以下がコードそのコードです。 #define MAX_PLOT_DATA_NUM 8 #define MAX_GRAPH_SET_NUM 35 //child -------------------------------------------------- typedef struct { char *fileName; int column[2]; char *caption; } Col; //child -------------------------------------------------- typedef struct { char *category; char *subCategory; char *xLabel, *yLabel; char *saveFileName; Col col[MAX_PLOT_DATA_NUM]; } GraphSet; //child -------------------------------------------------- typedef struct { char *lineFormat; int lineWidth; } Common; //mother ------------------------------------------------- typedef struct { GraphSet gs[MAX_GRAPH_SET_NUM]; Common common; } PlotFormats; int main(){ PlotFormats pF = { {"Motor angle","right","Time [s]","Angle [rad]","ang_R", {"motor.dat",1,2,"ang #1 "}, {"motor.dat",1,3,"ang #2 "}, {"motor.dat",1,4,"ang #3 "}, {"motor.dat",1,5,"ang #4 "}, {"motor.dat",1,6,"ang #5 "}, {"motor.dat",1,7,"ang #6 "}, }, //ここから下のコメントアウトしてる部分をはずすとコンパイルが通らなくなります。 //{"Motor angle","left","Time [s]","Angle [rad]","ang_L", // {"motor.dat",1,12,"ang #1 "}, // {"motor.dat",1,13,"ang #2 "}, // {"motor.dat",1,14,"ang #3 "}, // {"motor.dat",1,15,"ang #4 "}, // {"motor.dat",1,16,"ang #5 "}, // {"motor.dat",1,17,"ang #6 "}, //}, {"w l", 5}}; return 0; } エラーは ・間接参照のレベルが 'char *' と 'int' で異なっています。(複数) ・初期化子の数が多すぎます。 と出ます。 長くなりましたが、わかる方がいましたら、よろしくお願いします。