• ベストアンサー

ファイルを利用してデータを入力する・・

プログラミング初心者です。 本を使って学習しているんですが、書いてあるプログラムをやってみたんですが、上手くいきません。 「例外'System.NullReferenceException'がtest.exeで発生しました」とでます。 #include <stdio.h> int main() { int point[10][40]; int total[10]; int loop1,loop2; FILE *FP; /*ファイルを読み込み可能の状態にする*/ FP=fopen("test.txt","r"); /*ポイントの入力*/ for (loop2=0; loop2<10; loop2++) { for (loop1=0; loop1<40; loop1++) { printf ("背番号%2dの%d打席目のポイントを入力\n",loop2,loop1+1); fscanf (FP,"%d",&point[loop1][loop2]); } } /*ファイルの使用を終了する*/ fclose(FP); /*合計得点の計算*/ for (loop2=0; loop2<10; loop2++) { total[loop2]=0; { total[loop2]=total[loop2]+point[loop2][loop1]; } } /*結果の表示*/ printf ("ーーー結果ーーー\n"); for (loop1=0; loop1<40; loop1++) { for (loop2=0; loop2<10; loop2++) { printf ("%3d:",point[loop2][loop1]); } printf ("\n"); } printf ("---:---:---:---:---:---:---:---:---:---:---:\n"); for (loop2=0; loop2<10; loop2++) { printf ("%3d:",total[loop2]); } return 0; } という、テキストファイルからデータを入力するところなんですが、何処が違うのでしょうか? 教えてください、おねがいします。

  • hae2
  • お礼率34% (16/47)

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

ヒントだけ >fscanf (FP,"%d",&point[loop1][loop2]); >total[loop2]=total[loop2]+point[loop2][loop1]; 添え字の使用範囲はどこも変わらないのにloop1とloop2の指定の順番が違っているような。 >/*合計得点の計算*/ >for (loop2=0; loop2<10; loop2++) >{ >total[loop2]=0; >{ >total[loop2]=total[loop2]+point[loop2][loop1]; >} >} forループかなにか抜けてません?中括弧が多いような。 文法的に間違いではないんですけども。

hae2
質問者

お礼

>/*合計得点の計算*/ >for (loop2=0; loop2<10; loop2++) >{ >total[loop2]=0; >{ >total[loop2]=total[loop2]+point[loop2][loop1]; >} >} for文が抜けてました、ありがとうございます。 /*ポイントの入力*/ >for (loop2=0; loop2<10; loop2++) >{ >for (loop1=0; loop1<40; loop1++) >{ >printf ("背番号%2dの%d打席目のポイントを入力>\n",loop2,loop1+1); >fscanf (FP,"%d",&point[loop1][loop2]); この状態では、変数pointが[40][10]となってしまう、ということだったんですか、変えたらできました。 ヒントありがとうございました。

その他の回答 (3)

回答No.4

エラー「System.NullReferenceException」は#3さんが指摘されたようにファイル「test.txt」が所定のフォルダに存在しないためです。ファイル「test.txt」は   FP=fopen("test.txt","r"); となっていますので、カレントディレクトリにありませんとこのエラーになります。ファイル「test.txt」をtest.exeと同じフォルダに入れて実行しても良いでしょう。

hae2
質問者

お礼

一応test.exeのあるファイルにも入れておいたんです。test.txtを・・。 カレントディレクトリって何か分かりませんが、これからはtest.exeのあるファイルにちゃんと入れるようにします。 ありがとうございました。

回答No.3

test.txtは存在しますか? FP=fopen("test.txt","r"); でtest.txtファイルをオープンしていますが、ここでもしファイルが存在しないか、その他の要因でファイルエラーが発生した場合、FPはNULLになります。 fscanfでNULLポインタへアクセスしようとしますから異常事態になってしまいます。。 if (FP==NULL) { printf("file open error\n"); return -1;} などの処理を入れてあげないとまずいのでは?

hae2
質問者

お礼

test.txt、何処に入れたらいいのか分からなかったので、とりあえずプロジェクトファイルのいろんなことろに入れておきました。 これからはif (FP==NULL) { printf("file open error\n"); return -1;}などの処理をいれて、エラーが発生していないか確認してみます。 ありがとうございましあた。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

total[loop2]=total[loop2]+point[loop2][loop1]; の時に、loop1が40になっていますので、 配列範囲外です。 トータルを求める時、loop1も回すべきだと思います。

hae2
質問者

お礼

トータルを求める時、loop1の繰り返し処理が抜けてました・・。何を考えていたのか。 ありがとうございました。

関連するQ&A

  • EOFのエラーについて

    自分で考えてみたのですかどうもうまくいきません。 教えてください・ #include <stdio.h> int main () { int point[3][4]; int total[3]; int loop,loop1; for(loop1=0;loop1<3;loop1++) { for(loop=0;loop<4;loop++) { switch(loop1) { case 1:printf("A君\n");break; case 2:printf("B君\n");break; case 3:printf("C君\n");break; } printf("のゲーム%dの得点を入力してください\n",loop+1); printf("%d",&point[loop1][loop]); } } for(loop1=0;loop1<3;loop1++) { total[loop1]=0; for (loop=0;loop<4;loop++) { total[loop1]=total[loop1]+point[loop1][loop]; } printf("%4d",total[loop1]); } for (loop1=0;loop1<3;loop1++) { for(loop=0;loop<4;loop++) { printf("%4d",point[loop1][loop]); } printf("%4d",total[loop1]); } なんですがEOFのエラーと意味のわからない言葉でエラーがでるのですがいったいどうしたらいいんですか?

  • 入力ファイルのデフォルトの設定

    下のソースは入力ファイルの内容が例えば、 1 2 3 4 5 6 7 8 の時にその内容を出力するものです。 入力ファイル名がinput.datの場合、プログラム実行後にinput.datと入力し、Enterを押します。 このプログラムにinput.datをデフォルトとし、空Enterで入力を実行できるようにしたいと考えています。 入力ファイル名がinput.datでない場合は従来通りファイル名を入力してEnterを押すようにします。 この場合、どのようにソースを変更すればよいでしょうか。お手数ですが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,N=0,data[10]; char ifile[20]; FILE *fp; printf("input file name: "); scanf("%s",ifile); if((fp=fopen(ifile,"r"))==NULL){ fprintf(stderr,"input file error\n"); exit(1); } while(fscanf(fp,"%d",&data[N])!=EOF && N<10){ N++; } printf("Total Number of Data = %d\n",N); for(i=0;i<N;i++){ printf("%d\n",data[i]); } fclose(fp); return 0; }

  • 配列へのファイルの入出力

    C言語の質問です。 下記のプログラムについてint size、int valueのそれぞれの配列の数値をプログラムに直接描くのではなく、 テキストファイル等にあらかじめ書いた数値をfget関数などを用いてファイルの一行目はint sizeに、二行目はint valueに数値として入力・・・といったような感じで使用出来るよう書き換えたいのですが、 どのようにプログラムを書き換えれば可能になるでしょうか?ご教授いただけると幸いです。 #include <stdio.h> #include <stdlib.h> /* 配列size、valueはそれぞれ品物の大きさと価値を表している。 同じ添え字同士が対応している。たとえば、品物0の大きさはsize[0]、 価値はvalue[0]に入っている */ /* 品物の大きさ */ int size[] = {2, 3, 5, 7, 9}; /* 品物の価値 */ int value[] = {2, 4, 7, 11, 14}; /* 品物の種類の数 */ #define N (sizeof(size)/sizeof(size[0])) /* ナップザックの大きさの上限 */ #define MAX_M 200 int main(int argc, char **argv) { int i, j; /* ナップザックの大きさ */ int m; /* 現時点でナップザックに詰め込んだ品物の価値の合計 */ int total[MAX_M]; /* 最後に選んだ品物 */ int choice[MAX_M]; /* 品物iを入れたときの価値の合計 */ int repack_total; if (argc != 2) { fprintf(stderr, "usage: knapsack m\n"); fprintf(stderr, " ここで、mはナップザックの大きさ\n"); exit(1); } /* コマンド引数からナップザックの大きさを得る */ m = atoi(argv[1]); printf("size of knapsack is %d\n", m); if (m >= MAX_M) { fprintf(stderr, "ナップザックの大きさが大きすぎます\n"); exit(1); } /* 配列をクリアしておく */ for (i = 0; i <= m; i++) { total[i] = 0; choice[i] = -1; } /* 品物0~iまでを考慮に入れる */ for (i = 0; i < N; i++) { /* 大きさjのナップザックに対して、品物を詰め込んでみる */ for (j = size[i]; j <= m; j++) { /* もし品物iを入れたとすると、価値の合計はいくらに なるかを計算して、変数repack_totalに入れる */ repack_total = total[j - size[i]] + value[i]; /* 品物iを入れたほうが(入れないより)価値が大きくなる のなら、品物iを入れる */ if (repack_total > total[j]) { total[j] = repack_total; choice[j] = i; } } /* 配列total、choiceの中身をダンプする */ printf("i = %d\n", i); printf("total = "); for (j = 0; j <= m; j++) printf("%2d ", total[j]); printf("\nchoice = "); for (j = 0; j <= m; j++) printf("%2d ", choice[j]); printf("\n"); } /* どの品物をナップザックに入れたかを表示する */ for (i = m; choice[i] >= 0; i -= size[choice[i]]) printf("品物 %d (価値%d)を詰め込む\n", choice[i], value[choice[i]]); printf("価値の合計 = %d\n", total[m]); return (0); }

  • なんらかの原因でtxtにデータを入力できない

    こんにちは。 C言語初心者です。 まずこのようなデータを用意しました。 kus1.txt 89 65 37 44 51 30 20 10 そして、このようなプログラムをし、ビルトしました。 #include <stdio.h> #define NUM 8 int main(void) { FILE *fp; int kusa[NUM]; int max,min; int i,k; fp = fopen("kus1.txt","r"); if(fp == NULL){ printf("ファイルオープン失敗\n"); return 1; } for(i=0; i<NUM; i++){ fscanf(fp, "%d", &kusa[i]); } max = kusa[0]; min = kusa[0]; for(k=0; k<NUM; k++){ if(max < kusa[k]) max = kusa[k]; if(min > kusa[k]) min = kusa[k]; printf("NO.%-5d%d\n", k+1, kusa[k]); } printf("最高は%d。\n", max); printf("最低は%d。\n", min); fclose(fp); return 0; } その後、コマンドプロンプトでこれを実行したところ、 ファイルオープン失敗 とでてきました。つまりなんらかの原因で失敗しました。 どうしたら成功できるのでしょうか。教えてください。

  • ファイルから一文字ずつ読み込む

    ファイルを読み込むfgetc()関数のところでプログラムが停止します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char name[],int a){ printf("ファイル名を入力してください。\n"); scanf("%s",name); } void open(FILE *fp2,char name[]){ if((fp2=fopen(name,"r"))==NULL){ printf("ファイルオープンエラー"); } } int count(FILE *fp3){ int ch=0; int count=0; if(fp3==NULL){ printf("error"); } while((ch=fgetc(fp3))!=EOF){ if(ch=='\n'){ count++; } } printf("TEST"); fclose(fp3); return(count); } int main (void){ FILE *fp; char fname[30]; get_name(fname,30); open(fp,fname); printf("%d",count(fp)); return(0);} ファイル名を入力してください。ファイル名を入力、プログラム停止です。 '\n'を数えれるようにしてください。御指摘お願いします。

  • ファイルの入力、出力

    #include<stdio.h> int main(){ int a,b; FILE *fp0, *fp1;   fp0 = fopen("test1.dat", "r"); if( fp0 == NULL ){ printf("Cannot open test1.dat"); exit(1); } fp1 = fopen("file.txt", "w"); while((fscanf(fp0, "%d %d", &a,&b)) != EOF){ fprintf(fp1, "%d %d\n", a*a,b*b); } fclose(fp0); fclose(fp1); return(0); } test1.datファイルを読み込んで、変数a,bに値をいれ、 その二乗結果をfile.txtに書き込むプログラムなのですが test1.datファイルに書き込まれてる値をどのようにa,bに代入されているのかわかりません。 例えば test1.datが 1 2 3 4 5 であると、 file.txtには 1 4 9 16 25 16 と書き込まれています。 test1.datが 1 1 2 2 3 3 であると file.txtには 1 1 4 4 9 9 となっています。 どのように、変数に値が入るのでしょうか??

  • プログラムについて(C言語)

    #include<stdio.h> int main() { int i,n,total; for(;;){ /* 無限ループ*/ printf("整数n?"); /* nの値の表示 */ scanf("%d",&n); /* ifとbreakを使った終了判定 */ if(n<0)break; total=1; for(i=1;i<=n;i++){ printf("i=%d ",i); total*=i; /* total←total*i(階乗の計算) */ } printf("total=%d\n",total); /* totalの値(結果)の表示 */ } printf("Thanks\n"); /* 終了メッセージの表示 */ return(0); } これは階乗を求めるプログラムなのですが、i++ではなくi--をつかって求める場合 どのように変更すればよいでしょうか? for(i=1;i<=n;i++){ あたりをいろいろ弄ってみたのですが、求めてる結果は得られませんでした

  • ブラックジャック

    朝からブラックジャックに似たゲームでプログラムを作っています。 朝もこのページの方々にお世話になりました。 ありがとうございます。 そして終盤のにちかづき、〔プレーヤー〕が1と0以外の数字を 入力したときに、〔もう一度入力してください。〕と表示し、また 入力画面が表示されるようにしましたが、コンパイルのときに エラーがでます。 こちらがソースです。 本当に困っています。助けてください。 お願いします!! #include <stdio.h> #include <stdlib.h> int dice(void); int dice2(void); int dice3(void); int dice4(void); int dice5(void); main() { do{ int x=0,y=0,z=0,v=0,point=0,nyuryoku1,w=0,point2=0,point3=0,nyuryoku2=0; printf("ゲームを開始します。\n"); printf("\n"); printf("カードを配ります。\n"); /*関数代入*/ srand(time(NULL)); x=dice(); y=dice2(); z=dice3(); w=dice4(); srand(time(NULL)); v=dice5(); point=y+z; printf("デイーラー>カードは%d と??です。\n",x); printf("プレーヤー>カードは%d と%d です。ポイントは%dです。\n",y, z,point); printf("\n"); printf("プレーヤーの番です。\n"); /*プレーヤー*/ while(point<=21){ srand(time(NULL)); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice5(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point);} if(nyuryoku1==0){break;} else{ while(nyuryoku1!=90){ printf("入力が正しくありません。もう一度入力してください。\n"); printf("ヒットorスタンド??[ヒット=1;スタンド=0]\n"); scanf("%d",&nyuryoku1); v=dice5(); point=point+v; if(nyuryoku1==1){printf("カードは%d ポイントは%d\n",v,point); break;} if(nyuryoku1==0)break; }} if(point>21){ printf("プレーヤーのポイントは%d\n",point); printf("プレーヤーの負けです。\n"); printf("終了します。\n"); } /*デイーラー*/ printf("デイーラーの番です。\n"); point2=x+w; printf("デイーラー> カードは%d と%d です。ポイントは%dです。\n",x, w,point2); while(point2<17){ point2=point2+v; printf("デイーラー>カードは%d ポイントは%d\n",v,point2); } printf("プレーヤーのポイントは%d、デイーラーのポイントは%d。\n", point,point2); /*結果判定*/ if(point>point2){ printf("プレーヤーの勝ちです。\n"); } if(point<point2){ printf("デイーラーの勝ちです。\n"); } if(point==point2){ printf("引き分けです。\n"); } /*ゲームを続けるか?*/ printf("ゲームを続けますか?[続行=1:終了=0]\n"); scanf("%d",&nyuryoku2); if(nyuryoku2==0){printf("ゲームを終了しました。\n"); break;} }while(nyuryoku2==1); return 0; } /*関数定義*/ int dice(void){ return 1+(rand() % 10); } int dice2(void){ return 1+(rand() % 10); } int dice3(void){ return 1+(rand() % 10); } int dice4(void){ return 1+(rand() % 10); } int dice5(void){ return 1+(rand() % 10); }

  • c言語 

    答えを0にするこまち算のプログラムを組んでみたのですが、ここからどうしても進まなくなってしまいました。 自分ではいけるかなと思ったのですが、9-8-7+65-4321=9など答えがありえない数になってしまいます。 どこがいけないか教えてください。むしろ最初から組み直した方がよいのでしょうか… #include <stdio.h> int cul(); int num[9] ={9,8,7,6,5,4,3,2,1}; int total;/**/ int kigou[8]={0,0,0,0,0,0,0,0}; int main(){ for(kigou[0]=0;kigou[0]<3;kigou[0]++){ for(kigou[1]=0;kigou[1]<3;kigou[1]++){ for(kigou[2]=0;kigou[2]<3;kigou[2]++){ for(kigou[3]=0;kigou[3]<3;kigou[3]++){ for(kigou[4]=0;kigou[4]<3;kigou[4]++){ for(kigou[5]=0;kigou[5]<3;kigou[5]++){ for(kigou[6]=0;kigou[6]<3;kigou[6]++){ for(kigou[7]=0;kigou[7]<3;kigou[7]++){ keisan(); } } } } } } } } return 0; } int keisan(){ int n =0; int flag = 0; int t = 0; int i = 0; total = num[0]; /* for (n=0;n<9;n++) printf("kigou[%d] == %d",n,kigou[n]);確かめ*/ for(;n<8;n++){ if(kigou[n] == 0 && n == 0){ total = total * 10 + num[n+1]; for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ total = total * 10 + num[n+flag+1]; } n = n + flag; } flag=0; if(kigou[n]!= 0){ for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ t = num[n+1] * 10 + num[n+flag+1]; } n = n+ flag; total = total + t; } } /*0になる計算式の表示*/ kigou[8]=2;/*表示しないために空白を入れる*/ if(total==0){ for(i=0;i<9;i++){ printf("%d",num[i]); if(kigou[i]==0) printf("+"); if(kigou[i]==1) printf("-"); if(kigou[i]==2) printf(""); } printf("=%d\n",total); } return 0; }

  • ファイル入力

    1 20 2 30 3 95 4 52 5 90 3 Maximum  上記の様な入力ファイルinput.datのうち1~5行目のデータを表示するプログラムを作っています。  6行目は空白で、7行目は2列目の中で最大値をとる行の1列目の数値が入っています。  1列目の数値は最後の行を除いて重複することはありません。  入力データの行数はファイルによって最大20行まで変動します。列数は2列で固定です。  以下のプログラムのままでは6行目以降のデータも読み取ってしまい、出力がおかしくなってしまいます。  1~5行目のデータのみ出力するにはどうしたらよいでしょうか。  ご存知の方、お手数ですが教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 20 #define col 2 int main(){ int i,j,data[20][2]; FILE *fp; if((fp=fopen("input.dat","r"))==NULL){ fprintf(stderr,"Cannot open file input.dat\n"); exit(1); } for(i=0;i<row;i++){ for(j=0;j<col;j++){ fscanf(fp,"%d",&data[i][j]); printf("%d ",data[i][j]); } printf("\n"); } fclose(fp); return 0; }