- ベストアンサー
ファイル入力のエラー
以下のファイルを配列に読み込むプログラムを作っています。 1987 1100 12 23 2.467164 0.75153 1989 1202 12 31 2.456249 0.72896 1990 1204 9 28 2.484802 0.763903 1991 1206 11 26 2.520005 0.750182 1985 1207 9 26 2.499319 0.749116 以下の通りプログラムを組んでみました。 コンパイルしたところ、出力はされませんでした。 エラーも出ていないので、入力、出力などどこが悪いのかわかりません。 ほとんど初心者です。間違いが分かる方、よろしくお願いします。 #include<stdio.h> #define SIZE 5 main() { int a, b, c, d, i; static int year[SIZE],month[SIZE],day[SIZE],code[SIZE]; double e, f; static double latitude[SIZE],longitude[SIZE]; FILE *fp; fp=fopen("c\distance.dat","r"); while((fscanf(fp,"%d%d%d%d%lf%lf",&a,&b,&c,&d,&e,&f)) !=EOF) { year[i]=a; month[i]=b; day[i]=c; code[i]=d; latitude[i]=e; longitude[i]=f; i++; printf("%13d%8d%8d%8d%9.6lf%9.6lf\n",&a,&b,&c,&d,&e,&f); } fclose(fp); return(0); }
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。itohhといいます。 環境は、Windowsでよろしいんですよね?(Windowsと解釈して解説します。) 一応、確認したいのですが。 file.exeは、どのようにして動かしていますか? エクスプローラからダブルクリックで動かしていませんよね?(^_^; DOS窓(コマンドプロンプト)でfile.exeがあるディレクトリに移動して実行していますよね? >fp=fopen("c\\distance.dat","r"); >if(fp==NULL){ >printf("open error\n"); >return(1); >} それから、e101treさんのアドバイスにあるようにdistance.datは、どこにあるのでしょうか? (A)Cドライブ直下にあるのなら「c:\\distance.dat」 (B)file.exeがあるディレクトリの下にあるのなら「c\\distance.dat」 補足に載っているソースでは(B)になっていますが、OKですか? ファイルのオープンに失敗したのなら、printf文で出力している「open error」は出力されていますか? デバッグする環境が無い場合、(Visual C++のデバッガーなど) どこまで、動いたかを確認するためにprintf文を入れてみましょう。 例。(ファイルのオープンの前に入れてみる場合) #ifdef _DEBUG printf("<<DEBUG FileOpen>>\n"); #endif fp=fopen("c\\distance.dat","r"); if(fp==NULL){ printf("open error\n"); return(1); } #VC++の場合です。「_DEBUGのifブロック」は、デバッグバージョンのexeファイルを作ると コンパイルされるコードになり、リリースバージョンのexeファイルを作るとコメントとして 扱われます。
その他の回答 (3)
- e101tre
- ベストアンサー率38% (7/18)
fopen() が成功しているかチェックしてみてはいかかでしょう? fp=fopen("c\distance.dat","r"); if (fp == NULL) { printf("open error.\n"); return (1); } 多分、ここでエラーが起こっているのだと思います。 ファイル名が間違ってませんか。 "C\\distance.dat" (Cフォルダの下のdistance.datファイル) か、 "C:\\distance.dat" (Cドライブ直下のdistance.datファイル) かのどちらかだと思います。
補足
早々のお答えありがとうございます。 みなさんの意見を総合して以下のように変更しました。 #include<stdio.h> main() { int a, b, c, d; static int year[10],month[10],day[10],code[10]; double e, f; static double latitude[10],longitude[10]; FILE *fp; int i=0; fp=fopen("c\\distance.dat","r"); if(fp==NULL){ printf("open error\n"); return(1); } while((fscanf(fp,"%d%d%d%d%lf%lf",&a,&b,&c,&d,&e,&f)) !=EOF) { year[i]=a; month[i]=b; day[i]=c; code[i]=d; latitude[i]=e; longitude[i]=f; i++; printf("%13d%8d%8d%8d%9.6lf%9.6lf\n",a,b,c,d,e,f); } fclose(fp); return(0); } しかし、これでfile.exeというファイルができるのですが、何も表示されません。ファイルがオープンできていないということでしょうか?
- itohh
- ベストアンサー率45% (210/459)
こんにちは。itohhといいます。 なにも出力されないのは、 > printf("%13d%8d%8d%8d%9.6lf%9.6lf\n",&a,&b,&c,&d,&e,&f); の、「&a,&b,&c,&d,&e,&f」が間違っているからではないでしょうか? 「a,b,c,d,e,f」が正解だと思いますよ。(ヘルプで確認してみましょう!) あと、他の方が回答しているように変数は初期化を必ず行いましょう。 例。int i=0; 頑張ってください。(^_^;
- takebou
- ベストアンサー率43% (27/62)
コンパイルしただけで実行してないなんてことは無いですよね? 気づく点といえば、iを初期化していないことでしょうか。 このままですと、iがでたらめな数字になっていて、それでもプログラムは実行してしまいますから、 実行プログラム自体を書き換えたりします。 何も表示されないのかプログラムが動いてないのか判断するには、 printf に間違いなく表示される文字列(%を使わない)を入れてみると良いですよ。
お礼
ご丁寧にありがとうございました。 エクスプローラから、ダブルクリックしていました(^^;; 無事解決することができました。 未熟な私に回答をしてくださった方々、本当にありがとうございます。