コンパイルエラーが発生しました。クイズのファイルを読み込む方法を教えてください。

このQ&Aのポイント
  • 以下のコードを実行したところ、クイズのファイルを読み込むことができませんでした。
  • 問題ファイルやスコアファイルのパスなどが正しく指定されているか確認してください。
  • ファイルの読み込みに失敗した場合は、エラーメッセージが表示されるので、それを参考に修正してください。
回答を見る
  • ベストアンサー

この間質問した内容です。

この間質問した内容です。 #include <stdio.h> #include <stdlib.h> #include <string.h> int knum; int kNO; char **kstr; int *ans; int get_score(void) {  FILE *fp;  int best;  if((fp = fopen("score.txt","r")) == NULL)  {   printf("初回起動ですね。\nスコアファイルを新規作成します。\n");   best = 0;  }  else  {  fscanf(fp,"%d%d",&best,&knum);  printf("最高点は%d問中%d問です。\n",knum,best);  fclose(fp);  } } int read_kuizu(void) {  int i;  FILE *fp;  if((fp = fopen("kuizu.txt","r")) == NULL) return(-1);  fscanf(fp,"%d",&kNO);  if((kstr = (char **)calloc(kNO,sizeof(char *))) == NULL) return(-1);  if((ans = (int *)calloc(kNO,sizeof(int))) == NULL) return(-1);  for(i = 0; i<kNO; i++)  {   char temp[1024];   size_t len;   fscanf(fp,"%s",temp);   fscanf(fp,"%d",&ans[i]);   len = strlen(temp);   if((kstr[i] = (char *)malloc(len + 1)) == NULL) return(-1);   strcpy(kstr[i],temp);  }  fclose(fp);  return(0); } int kuizu_game(void) {  int i;  int score = 0;  for(i = 0; i<kNO; i++)  {   int unans;   printf("\nクイズ%d\n", i + 1);   printf("%s YES(0)/NO(1)\n",kstr[i]);   do   {    printf("答を選んで番号を入力して下さい。=>\n");    scanf("%d",&unans);   }   while(unans!=0 && unans!=1);   if(unans == ans[i])   {    score++;    printf("正解です!\n");   }   else   printf("残念ながら不正解・・・\n");   }   return(score); } void result(int best,int score) {  printf("\n今回%d問中%d問正解でした。\n",kNO,score);  printf("前回は%d問中%d問正解していました。\n",knum,best); } int main(void) {  int score;  int best;  best = get_score();  if(read_kuizu() == -1)  {   printf("エラー\n");   return(-1);  }  score = kuizu_game();  result(best,score);  if(score>best)  {   printf("最高点を更新!\n");   best = score;  }  FILE *fp;  fp = fopen("score.txt","w");  fclose(fp);  return(0); } 一応ここまでやってコンパイルしたのですが、クイズのファイルを読み込む事ができません。どこか間違ってるんでしょうか?

  • BNR33
  • お礼率14% (5/34)

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> この間質問した内容です その質問へのリンクを付けるとかした方が、前の内容を確認できるのでよいです。 あと、続きの質問するなら、前のは閉じましょう。 以前の質問に > 問題のテキストは、「1,問題文 1.○○ 2,○○ 3.○○」とし、頭に解答を書いています とありますが、このプログラムでは、最初に > fscanf(fp,"%d",&kNO); と、問題数らしきものを読んでいます。これは仕様変更があったのでしょうか。 もしそうだとして、その次からフォーマット通りだったとして > fscanf(fp,"%s",temp); > fscanf(fp,"%d",&ans[i]); とすると、char *の tempには、「空白以外の文字列」である「1,問題文 1.○○ 2,○○」が入るはずです。 (3.の直前がスペースになっているので。問題文の途中に(半角)空白があればその直前まで、無ければ、行の最後まで読みこまれます) ans[i]には、その直後の「数字文字列」を整数と解釈して読み込まれるので、この例では「3.○○」の「3」が入ります。 次の「問題」を読みに行こうとすると、続きの「3.○○」の「.」から開始するのでtempには「.○○」が入ります。 ・fscanfの %s は「空白以外の文字列」です。問題の途中に空白があるとその直前までしか読み込みません。 さらに、次に実行されたfscanfは前回の続きから読み込みます。行頭ではありません。 ・ %dも数字の文字列しか読みこみません。 正しく正解の位置から読み込んでいたとしても、次はカンマから読み込みが始まります。 ・書式を変えて読めるようにしたとしても、「正解,問題文」と並んでいるのに、問題文の方から読みだそうとしています。 順番が違います。 fscanfのフォーマット文字列のところをよくよく読みなおしてください。

その他の回答 (2)

回答No.3

kstr[i] って、何スか?どこ指すっスか? 以上、C言語をそれなりに使ってる者より。

回答No.2

> クイズのファイルを読み込む事ができません。  読み込むことが出来ないとは? (0)read_kuizu()を呼ぶ前にシステムエラーでこける (1)read_kuizu()を呼んだらシステムエラーでこける (2)read_kuizu()の結果が常にエラー  a) fopenでエラー  b) callocでエラー(kstr)  c) callocでエラー(ans)  d) mallocでエラー (3)read_kuizu()の結果は正常だけど、データが読まれていない。 (4)read_kuizu()の結果は正常でデータは読まれてるけど、期待した内容ではない。  あからさまなコーディングミスというものはちょっと見つかりませんので、どういう状況を指して読めないと言ってるのかわからないと対策の考えようがありません。  あと、どういうデータを読もうとしてるかにもよるので、それがわからないとどうしようもありません。ソースを見る限りでは前回の質問に書かれていた質問データの構造とは違うと思われますので。

関連するQ&A

  • C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問

    C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問です! ファイルを開いた後でエラーとなるのですが、何が足りないのでしょうか? ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int k,i=0; int num[10]; char na[10][20]; fp=fopen(argv[1],"r"); if(fp==NULL){ printf("ファイルを開けません\n"); return 1; }else{ printf("開けた\n"); } while(fgets(str,sizeof str,fp)!=NULL){ tp=strtok(str," "); num[i]=atoi(tp); tp=strtok(NULL," "); strcpy(na[i],tp); i++; } printf("%d\n%s\n",num[0],na[0]); printf("%d\n%s\n",num[1],na[1]); fclose(fp); return 0; }

  • テキストファイルの内容を2次元配列に格納したい

    課題で用意されたテキストファイルを読み込み、空白を区切りとする文字列の単位で配列に格納したいのですが、やりかたがわかりません。 ソースプログラムですが #include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 1000 int TextSplit(char *fname, char (*SpStr)[50]); int main(void) { int i, n; char fname[MAX], SpStr[MAX][50]; int Split; FILE *fp; printf("input File =>"); scanf("%s", fname); Split = TextSplit(fname, SpStr); printf("\n %d[文字列数] \n", Split); return 0; } int TextSplit(char *fname, char (*SpStr)[50]) { int i, j, k; char Readstr[MAX]; FILE *fp; fp = fopen(fname, "r"); if(fp == NULL) { printf("ファイルオープン失敗"); return 1; } i = 0; while(fscanf(fp, "%s", SpStr) != EOF) { i++; } fclose(fp); return i; } 以上のソースプログラムですが、内容は「空白で区切る文字列の単位の総数を表示する」ものになっています。 今日の20時までに終わらせないといけないので、ご教授お願いします。 使ってるソフトはMicrosoft Visual Studioです。

  • c言語構造体に関するプログラム

    データファイルをコマンドラインから読み込み、元のファイルの内容に加えその平均と評価を出力するプログラムを作っているのですが、実行しても意味のわからない文字が羅列され更に平均等が0になってしまいます。 分かる方いらっしゃいましたら回答よろしく願いします<(_ _ )> ↓読み込むデータファイルの内容 1077001 Jack 87 70 71 92 91 1077002 Jo 67 77 75 92 71 1077003 Akira 37 60 71 52 36 (中略) 1077016 Kazu 95 97 90 95 98 以下、ソースコード #include <stdio.h> #include <stdlib.h> typedef struct{ char sid[8]; char sname[10]; int score[5]; char grade; double ave; } Record; char grade_char(double); int main(int argc, char *argv[]){ Record data[20]; FILE *fp; int i; if((fp = fopen(argv[1],"r")) == NULL){ printf("Cannot open file!\n"); exit(1); }else if(argc == 1) printf("Error! Usage: ./a.out datafilename"); i = 0; while(fscanf(fp,"%s %s %d %d %d %d %d",data[i].sid,data[i].sname,&data[i].score[0],&data[i].score[1],&data[i].score[2],&data[i].score[3],&data[i].score[4])){ i++; data[i].ave = (data[i].score[0]+data[i].score[1]+data[i].score[2]+data[i].score[3]+data[i].score[4])/5; data[i].grade = grade_char(data[i].ave); printf("%s %s %d %d %d %d %d %.1f %c\n",data[i].sid,data[i].sname,data[i].score[0],data[i].score[1],data[i].score[2],data[i].score[3],data[i].score[4],data[i].ave,data[i].grade); } fclose(fp); return 0; } char grade_char(double ave){ if(0 <= ave && ave <= 34)return 'F'; else if(35 <= ave && ave <= 49)return 'D'; else if(50 <= ave && ave <= 64)return 'C'; else if(65 <= ave && ave <= 79)return 'B'; else if(80 <= ave && ave <= 100)return 'A'; else return 0; }

  • C言語のソートについて

    C言語で下記のファイルの中身を昇順と降順で出力しようとしているのですが、ソートが上手くいっていない状況です。 どなたか修正点を教えて頂けないでしょうか? 「ファイルの中身」 2022/11/14 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 2022/11/15 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/18 16:20:18 8+8,16.000000 2022/11/17 16:19:56 4+4,8.000000 2022/11/14 16:20:14 7+7,14.000000 2022/11/14 16:20:18 8+8,16.000000 「ソースコード」 #include <stdio.h> #include <string.h> #include <stdlib.h> int cmp_u(const void* a, const void* d) { return *(char*)a - *(char*)d; } int cmp_d(const void* a, const void* d) { return *(char*)d - *(char*)a; } int main() { int r,i,n; FILE* fp; char sin[9][1000]; fp = fopen("log.txt", "r"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } for (i = 0; i < 9; i++) { fscanf(fp, "%s", &(sin[i])); } fclose(fp); printf("ASC or DESC: "); scanf(" %s", &ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, 9, sizeof(char), cmp_u); } else { qsort(sin, 9, sizeof(char), cmp_d); } for (i = 0; i < 9; i++) { printf("%s\n", sin[i]); } return 0; }

  • fscanf

    fscanfを使って、ファイル(普通の英文が入っています)から一単語ずつ読み込んでいきたいと思っているのですが、どうすれば良いのかわかりません。 int main(int argc,char *argv[]){ FILE *fp; char *word; fp = fopen(argv[1], "r"); if(fp == NULL){ printf("error: not open file.\n"); return(0) ;} while( ){ fscanf(fp,"%[a-zA-Z]",word); printf("%s\n", word); fflush(stdout); } fclose(fp); return 0; } とりあえず上の様なプログラムで、一単語ずつ順番に単語を出力できるようにしたいと思っているのですが。 いろいろ変なところなど在ると思いますが、whileの条件など、どうすればよいか教えてください。

  • エラーが出ます

    12,51,13,123,133,551,… というコンマで区切られているファイルを読み込みたいです。数字は100文字です。どう書けば全部読み込めるでしょうか? よろしくお願いします。 int main(int argc,char *argv[ ]){ int line; int i; FILE *fp; fp = (argc > 1)? fopen(argv[1],"r"): stdin; if(fp==NULL){ perror("fopen"); exit(0); }   while(fscanf(fp,"%d",&line) != EOF){ printf("%d\n") } if(argc>1){ fclose(fp);   }

  • C言語のプログラミングで困っています

    C言語を勉強しています。まだまだ初心者で分からないことだらけなのですが、今回はファイル入出力の部分が分からず苦戦しています。 『100個の実数が入った2つのテキストファイルから数値を読み込み、  絶対値を求めるなどの計算をする』プログラムを作成しているのですが、 コンパイルし実行すると強制終了してしまいます。 プログラムは、 void main(void) { FILE *fp; double c[50000];   double d[50000];   double e[50000]; int n = 0;   int m = 0;   int i = 0;   char fname[80];   char fname2[80]; printf("ファイル名 : ");    gets(fname); if((fp = fopen(fname, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&c[i])!=EOF){ printf("%3d : %3lf",++n,c[i]); printf("\n"); i++; } printf("\n"); i=0; n=0; printf("ファイル名 : ");    gets(fname2); if((fp = fopen(fname2, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&d[i])!=EOF){ printf("%3d : %3lf",++n,d[i]); printf("\n"); i++; } …(以下計算) のようになっています。 整数のデータで計算を行うと、正常に動くのですが…。 コンパイルしてもエラーが出ないので、どこが悪いのかわからず困っています。 どなたか教えていただけないでしょうか。お願いしますm(_ _)m

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力するのはどうやってやるのですか?教えてください。以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。これに処理時間を出力するようにしてもらいたいのですが、どうしたらいいですか?解説とソースファイルをよろしくお願いします。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; }

  • ファイルの内容の表示

    実行時のコマンドライン引数で指定したファイルの内容を、行番号付きで画面に表示するプログラムを作る という問題です。ヒントも与えられています。 行番号付きの表示、コマンドライン引数の利用。両者を組み合わせればできるはずだ >  main関数の引数にargcとargvを指定して、コマンドライン引数をファイル名として利用する。キーボード入力を促す文(プロンプト)や改行チェックは不要なので書かないこと >  コマンドライン引数が指定されない場合は、メッセージを表示してプログラムを終了 >  ファイルの内容を画面表示する処理は、ユーザー定義関数put_file_contentsに記述する。仮引数には文字型のポインタ変数をひとつ指定し、ファイル名を受け渡せるようにする。put_file_contents自体の型は整数型(int)で、正常終了なら返り値0を返すこと。 行番号付きのプログラム#include<stdio.h> > int put_file(char *filename); > > int main() > { > char line[50]; > char *ptr; > > printf("ファイル名を入力:"); > fgets(line,sizeof(line),stdin); > ptr = line + strlen(line) - 1; > if(*ptr == '\n') { > *ptr = '\0'; > } > > put_file(line); > > return 0; > } > > int put_file(char *filename) > { > FILE *fp; > char buf[100]; > int line_no; > > fp = fopen(filename,"r"); > if (fp == NULL){ > printf("%sを開けません\n",filename); > return 1; > } > line_no = 1; > while (fgets(buf,sizeof(buf),fp) != NULL){ > printf("%3d: ",line_no); > printf("%s",buf); > line_no++; > } > fclose(fp); > > return 0; > } で、コマンドライン引数のプログラムは#include<stdio.h> void write_key_inputs(char *filiname); int main(int argc, char *argv[1]) { write_key_inputs(argv[1]); return 0; } void write_key_inputs(char *filename) { FILE *fp; char buf[100] ; fp = fopen(filename,"w"); while(fgets(buf, sizeof(buf),stdin) != NULL) { fputs(buf, fp); } fclose(fp); return ; } です。これらを組み合わせて少しいじると出来るみたいなのですが、できていません。ちなみに私が考えたプログラムは #include<stdio.h> int put_file_contents(char *filename); int main(int argc,char *argv[]) { int i; if(argc == 1){ printf("コマンドライン引数がありません\n"); return 1; } for(i = 0;i<argc;i++) printf("argv[%d]は「%s」です\n",i,argv[i]); put_file(i); return 0; } int put_file(char *filename) { FILE *fp; char buf[100]; int line_no; fp = fopen(filename,"r"); line_no = 1; while (fgets(buf,sizeof(buf),fp) != NULL){ printf("%3d: ",line_no); printf("%s",buf); line_no++; } fclose(fp); return 0; } です。コマンドライン引数は表示されるのですが、行番号が表示されません。どうしたらいいでしょうか??

  • おしえて

    #include <stdio.h> #include <stdlib.h> int a[30000][6]; int main(int argc, char *argv[]) { FILE *fp; int c,n,i,j; if ((fp = fopen(argv[1], "r")) == NULL) { printf("File Open Error.\n"); exit(1); } for(i=0;i<30000;i++){ for(j=0;j<6;j++){ c = fscanf(fp, "%d", &n); if (c) { a[i][j]=c; printf("%d ",a[i][j]); } } printf("\n"); } fclose(fp); return 0; } このプログラムを書きましたna.txtのファイルが以下のようなとき 1 2 3 4 5 6 3 4 5 6 7 8 のとき先頭の1しか配列に格納できません。どうしても順番にa[0][0~5]=1~6と入れたいです。どうしてもわかりません。おしえてください!!