• ベストアンサー

ファイル入力のエラー

以下のファイルを配列に読み込むプログラムを作っています。 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); }

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

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.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ファイルを作るとコメントとして 扱われます。

kingyobachi
質問者

お礼

ご丁寧にありがとうございました。 エクスプローラから、ダブルクリックしていました(^^;; 無事解決することができました。 未熟な私に回答をしてくださった方々、本当にありがとうございます。

その他の回答 (3)

  • e101tre
  • ベストアンサー率38% (7/18)
回答No.3

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ファイル) かのどちらかだと思います。

kingyobachi
質問者

補足

早々のお答えありがとうございます。 みなさんの意見を総合して以下のように変更しました。 #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)
回答No.2

こんにちは。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)
回答No.1

コンパイルしただけで実行してないなんてことは無いですよね? 気づく点といえば、iを初期化していないことでしょうか。 このままですと、iがでたらめな数字になっていて、それでもプログラムは実行してしまいますから、 実行プログラム自体を書き換えたりします。 何も表示されないのかプログラムが動いてないのか判断するには、 printf に間違いなく表示される文字列(%を使わない)を入れてみると良いですよ。

関連するQ&A

  • 関数の作り方(初心者です)

    バブルソートをするプログラムを作っています。 以下の部分を関数として、作って挿入したいのですがどのようにすれば 読み出すことができるのでしょうか。 { int a,b,c,d; float e,f; a=year[l+1] year[l+1]=year[l] year[l]=a b=month[l+1] month[l+1]=month[l] month[l]=a c=day[l+1] day[l+1]=day[l] day[l]=c d=code[l+1] [l+1]=code[l] code[l]=d e=latitude[l+1] [l+1]=latitude[l] latitude[l]=d f=longitude[l+1] [l+1]=longitude[l] longitude[l]=f }

  • 平均、分散を求めたときの入力エラー

    入力された10個の数字について平均、分散を求めるため素朴に書いてみました。 #include<stdio.h> int main(){ char buf[256]; double a,b,c,d,e,f,g,h,i,j,mean,variance; fgets(buf,256,stdin); sscanf(buf,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j); if(!sscanf(buf,"%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j)){ printf("数字を入力してください。\n"); }else{ mean=(a+b+c+d+e+f+g+h+i+j)/10; variance=((a-mean)*(a-mean)+(b-mean)*(b-mean)+(c-mean)*(c-mean)+(d-mean)*(d-mean)+(e-mean)*(e-mean)+(f-mean)*(f-mean)+(g-mean)*(g-mean)+(h-mean)*(h-mean)+(i-mean)*(i-mean)+(j-mean)*(j-mean))/10; printf("平均=%lf\n",mean); printf("分散=%lf\n",variance); return 0; } } 途中、数字が入力されなかったときに”数字を入力してください。” と書きたかったのですがうまくいきません。あと、10個より少なく入力したときのエラー表示もしたいのですが… 教えてください。よろしくお願いします。

  • csvファイルの読み込み

    fscanf関数を用いて、csvファイルの内容を構造体のそれぞれのメンバに読み込んで表示させようとしているのですが、4列目以降が上手く読み込めません。初歩的な質問で申し訳ありませんがどなたか教えてください。 ****************************ソース************************************************ #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 64 #define FILE_NAME "view_001_McdlData.csv" #define FILE_SIZE 819200 struct Data{ int DataNo; int FrameNo; int SampleNo; char Digital; double voltage; double trigger; double C; double D; }; int main(int argc, char *argv[]) { FILE* fp,*fo, *fi; // ファイルポインタ用 int n, i, file_size; double time,vel[FILE_SIZE]; struct Data *dat; char buff[SIZE]; if ((fp = fopen(FILE_NAME,"r")) == NULL) { printf( "file open error\n" ); exit(EXIT_FAILURE); } fseek(fp, 0, SEEK_END); file_size = ftell(fp); dat = (struct Data*)malloc(file_size); printf("malloc address= %p, file size= %d\n", dat, file_size); fseek(fp, 0, SEEK_SET); i = 0; //データの読み込み while((fscanf(fp, "%d,%d,%d,%s,%lf,%lf,%lf,%lf",&dat[i].DataNo,&dat[i].FrameNo,&dat[i].SampleNo,&dat[i].Digital,&dat[i].voltage,&dat[i].trigger,&dat[i].C,&dat[i].D)) !=EOF ){ printf("%d %d %d %s %lf %lf %lf %lf\n",dat[i].DataNo,dat[i].FrameNo,dat[i].SampleNo,dat[i].Digital,dat[i].voltage,dat[i].trigger,dat[i].C,dat[i].D); i++; } fclose(fp); return 0; } ***********************************csvファイルの内容************************************ 0,1,0,0x3F,2.270000,0.000000,-1.000000,-1.000000 1,1,1,0x3F,2.260000,0.010000,-1.000000,-1.000000 2,1,2,0x3F,2.260000,0.010000,-1.000000,-1.000000 3,1,3,0x3F,2.260000,0.010000,-1.000000,-1.000000 4,1,4,0x3F,2.260000,0.010000,-1.000000,-1.000000 5,1,5,0x3F,2.260000,0.000000,-1.000000,-1.000000 ***************************************************************************************************

  • 20日締めの表示がずれる

    いつもお世話になります。 WIN7 EXCELLL2010 です。 添付図で説明さていただくと、 A2 A3 は20日の締めで翌月の入金の設定したいのです。 ところが 「I6」に「2,500」が1列ずれて表示されます。 これを  「J6」に「2,500」に修正したい。 どこか私のやり方に問題があると思いますが御指導をいただけませんでしょうか。 参考に I1 =DATE($D$1-1,12,1) J1 =DATE($D$1,1,1) I6 =SUMPRODUCT(($A$2:$A$1000>=DATE(YEAR($I$1),MONTH($I$1)-1,VLOOKUP($E7,$E$3:$G$7,2,0)))*($A$2:$A$1000<=DATE(YEAR($I$1),MONTH($I$1),VLOOKUP($E7,$E$3:$G$7,3,0)))*($B$2:$B$1000=$E7)*($C$2:$C$1000))

  • C言語の計算についての質問です.

    C言語の計算についての質問です. 1 2 3 4 5 6 2 3 4 5 6 7 3 4 5 6 7 8 というようなファイルを行ごとに読み込んで、列ごとの和を算出させたいと考えています. 以下のようなプログラムをテスト作成してみたのですが,『 b=1のときのa[1] + b=2のときのa[1] 』のような計算ができません. どのようなプログラムを作成すればこの問題が解決できるか教えてください. #include <stdio.h> #include <string.h> int main(void) { FILE *fp; int i, j, k, no, b; double a[12]; double c[3]; char buffer[1024]; for(i=1; i<=2; i++) { sprintf(buffer, "PIVdemo_00%d%d.txt", i/10, i%10); printf("%s \n", buffer); fp = fopen(buffer,"r"); for(b=1; b<=12; b++) { fscanf(fp, "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9], &a[9], &a[10], &a[11], &a[12]); printf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf \n", a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[9], a[10], a[11], a[12]); } for(b=0; b<=2; b++){ c[3]=a[b] + a[b+1]; printf("%lf", c[3]); putchar('\n'); } fclose(fp); } return (0); }

  • テキストファイルの出力について

    今、学校の課題でC言語を使ってプログラムを作っています。 20000個のデータを読み込んで、200個ずつに区切り、別々のテキストファイルで出力するというものです。 最初につくったのは、以下の通りです。 *********************************************** FILE *fp; { int b,i=0; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; fp = fopen("D1.txt","w"); for(i=0;i<=199;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); fp = fopen("D2.txt","w"); for(i=200;i<=399;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); } fclose(fp); ・・・ ***************************************** これだと20000まで繰り返し記述しなければならずかなり困難だと思いました。そこで、ループを作ろうとしたのですが、テキストファイルをループを使って複数作成する方法がわかりません。 以下のようなプログラムを作ったのですが、テキストファイルが一つしか作られませんでした。 どのように記述すればよいのでしょうか? **************************************** FILE *fp; { int a,i=0; int b=1; int c=199; data[0][i]=trend_data[0][i]; data[1][i]=trend_data[1][i]; start: fp = fopen("D[1+b].txt","w"); for(i=a;i<=c;i++){ fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); if(i > c) c = c+200; a = a+200; b++; goto start; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } ****************************************** よろしくお願い致します。

  • セグメンテーションエラーです

    行列の積の計算のプログラムです #include <stdio.h> #include <math.h> #define MN 1200 int main() { double A[MN][MN],B[MN][MN],C[MN][MN]; int i,j,k; double an=0,am=0,bn=0,bm=0; FILE *fp1; FILE *fp2; FILE *fp3; fp1 = fopen("1200A.dat", "r"); for(i=0;i<am;i++){ for(j=0;j<an;j++){ fscanf(fp1,"%lf",&A[i][j]); } } fclose(fp1); fp2=fopen("1200B.dat","r"); for(i=0;i<bm;i++){ for(j=0;j<bn;j++){ fscanf(fp2,"%lf",&B[i][j]); } } fclose(fp2); for(i=0;i<am;i++){ for(j=0;j<bn;j++){ C[i][j]=0.0; for(k=0;k<bm;k++){ C[i][j]+=A[i][k]*B[k][j]; } } } fp3=fopen("ans1200C.dat","w"); for(i=0;i<am;i++){ for(j=0;j<bn;j++){ fprintf(fp3,"%lf ",C[i][j]); } fprintf(fp3, "\n"); } fclose(fp3); return 0; }

  • この動画ファイルが見れないのです。

    GOMPlayerを使っています。サイトからダウンロードした動画なんですが、真空波動研で調べると、[9D 8B 5A 4B75 7E 93 4A D7 F4 6E 1A 49 F0 9E C2]: ZKu~ J n I [未対応形式] と出てしまいます。拡張子は一応AVIなんですが、極窓では ? となってしまいます。ファイルサイズは500MBです。これはもうあきらめたほうがいいのでしょうか?見れる物なら見たいのですが。よろしくお願いします。

  • スケジュール管理表を作っています。数式があれば教えてください。

    たとえば、下記のような表があります。 E 総数量 に対し、A~B期間内の日数を F~の月ごとのカレンダーに数量を反映させる事は出来ますでしょうか。 現在、数式を入れた例をのせましたが、F2 ~ I2 までに入る数式に苦戦しています。現在、数式例を載せましたが、一日の本数が反映するようになってしまいました。 A、Bを読み取る事はできたのですが、下のように、G2=93 H2=6というような結果になるように、どなたか知恵をお貸しください。 m( _ _ )m    A    B     C     D     E     F    G   H   I 1  開始  終了 期間日数 一日本数 総数量本 7月  8月  9月  10月 2   8/1  9/2     33     3     100      93  6 C2=(DATEDIF(A3,B3,"d")+1) D2=ROUNDDOWN(D3/C3,0) F2=IF(AND(MONTH(G$1)>=MONTH($A3),MONTH(G$1)<=MONTH($B3)),$E3,"")   

  • gifファイルの誤表示

    下のgifファイルをペイントで表示すると「6906」と表示されるのに、 Microsoft Photo Ediditorでは、「6」と表示されます。 これは何故でしょうか? これが原因で、あるサイトの画像が変に表示されます。 (迷惑がかかるといけないので、サイト名は言えませんが) gifファイルをアップできないので、16進数で示します。 宜しくお願い致します。 00000000 47494638 39611C00 0800B300 00000000 GIF89a.......... 00000010 FFFFFF00 00000000 00000000 00000000 ................ 00000020 00000000 00000000 00000000 00000000 ................ 00000030 00000000 00000000 00000000 0021F904 .............!.. 00000040 00000000 002C0000 00000700 08000004 .....,.......... 00000050 10304840 650076E6 49B1FEDE F5899C17 .0H@e.v.I....... 00000060 010021F9 04000000 00002C00 00000007 ..!.......,..... 00000070 00080000 04103048 40650076 E649B1FE ......0H@e.v.I.. 00000080 DEF5899C 17010021 F9040000 0000002C .......!......., 00000090 07000000 07000800 00041030 0440E5B4 ...........0.@.. 000000a0 4066CDFB A49B7589 21B84500 21F90400 @f....u.!.E.!... 000000b0 00000000 2C0E0000 00070008 00000410 ....,........... 000000c0 300440E5 B44066CD FBBE20F8 8D551001 0.@..@f... ..U.. 000000d0 0021F904 00000000 002C1500 00000700 .!.......,...... 000000e0 08000004 10304840 650076E6 49B1FEDE .....0H@e.v.I... 000000f0 F5899C17 01003B ......;

専門家に質問してみよう