- ベストアンサー
ファイルを利用してデータを入力する・・
プログラミング初心者です。 本を使って学習しているんですが、書いてあるプログラムをやってみたんですが、上手くいきません。 「例外'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; } という、テキストファイルからデータを入力するところなんですが、何処が違うのでしょうか? 教えてください、おねがいします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ヒントだけ >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ループかなにか抜けてません?中括弧が多いような。 文法的に間違いではないんですけども。
その他の回答 (3)
- MunyaMunya
- ベストアンサー率26% (5/19)
エラー「System.NullReferenceException」は#3さんが指摘されたようにファイル「test.txt」が所定のフォルダに存在しないためです。ファイル「test.txt」は FP=fopen("test.txt","r"); となっていますので、カレントディレクトリにありませんとこのエラーになります。ファイル「test.txt」をtest.exeと同じフォルダに入れて実行しても良いでしょう。
お礼
一応test.exeのあるファイルにも入れておいたんです。test.txtを・・。 カレントディレクトリって何か分かりませんが、これからはtest.exeのあるファイルにちゃんと入れるようにします。 ありがとうございました。
- JaritenCat
- ベストアンサー率37% (122/322)
test.txtは存在しますか? FP=fopen("test.txt","r"); でtest.txtファイルをオープンしていますが、ここでもしファイルが存在しないか、その他の要因でファイルエラーが発生した場合、FPはNULLになります。 fscanfでNULLポインタへアクセスしようとしますから異常事態になってしまいます。。 if (FP==NULL) { printf("file open error\n"); return -1;} などの処理を入れてあげないとまずいのでは?
お礼
test.txt、何処に入れたらいいのか分からなかったので、とりあえずプロジェクトファイルのいろんなことろに入れておきました。 これからはif (FP==NULL) { printf("file open error\n"); return -1;}などの処理をいれて、エラーが発生していないか確認してみます。 ありがとうございましあた。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
total[loop2]=total[loop2]+point[loop2][loop1]; の時に、loop1が40になっていますので、 配列範囲外です。 トータルを求める時、loop1も回すべきだと思います。
お礼
トータルを求める時、loop1の繰り返し処理が抜けてました・・。何を考えていたのか。 ありがとうございました。
お礼
>/*合計得点の計算*/ >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]となってしまう、ということだったんですか、変えたらできました。 ヒントありがとうございました。