• ベストアンサー

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

プログラミング初心者です。 本を使って学習しているんですが、書いてあるプログラムをやってみたんですが、上手くいきません。 「例外'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; } という、テキストファイルからデータを入力するところなんですが、何処が違うのでしょうか? 教えてください、おねがいします。

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

  • ベストアンサー
  • 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

専門家に質問してみよう