- 締切済み
卒論
下記のプログラムなのですが、入力ファイルがテキストだと上手くいくのですが csvだとうまくいきません。 ちなみに、入力ファイル内容は 13.csv tenb 42885415 123 255 236 tenb 42885415 252 498 452 といった内容が1500行程あります。 本当に困っていますどうか助けてください。 カンマも入ってるんです。 プログラム内容(本来はファイルを3つ入力しますが文字数の関係で1つにしています) #include<stdio.h> #include<stdlib.h> #include<math.h> main() { FILE *fin,*fin2,*fin3; char n[2000][1]; double g=0,z=0,p=0,p2=0,s[2000][10],,g2=0,z2=0,r,r1,r2,r3,r4,r5,r6; int w2=0,w1=0,w=0,a=0,b=0,i=0,j=0,k=0,m=0,u=0,y=0,a2=0,b2=0,i2=0,j2=0,k2=0,m2=0,u2=0,y2=0,i3=0,j3=0,a3=0,u3=0,y3=0,flag=0; if((fin=fopen("13.csv","r"))==NULL){ printf("入力ファイルがオープンできません.\n"); exit(1); } while( flag!=1 ){ if(j2==0) { fscanf(fin,"%s,",&n[i2][j2]); if(n[i2][j2] == EOF) { flag = 1; } } else { fscanf(fin,"%lf,",&s[i2][j2]); } j2++; if(j2>=5) { j2=0; i2++; } } for(i2=0;i2<=2000;i2++){ g2=sqrt((s[i2][2]*s[i2][2])+((s[i2][3])*(s[i2][3]))+(s[i2][4]*s[i2][4])); if(g2>max2 && g2<5000) { max2=g2; a2=i2; } } //printf("%5lf",sqrt((c[a][0]*c[a][0])+(c[a][1]*c[a][1])+(c[a][2]*c[a][2]))); //printf("%d",a+1); for(k2=a2-140;k2<=a2-40;k2++) { if(sqrt((s[k2][2]*s[k2][2])+((s[k2][3])*(s[k2][3]))+(s[k2][4]*s[k2][4]))>z2) { z2=sqrt((s[k2][2]-s[0][2])*(s[k2][2]-s[0][2])+((s[k2][3]-s[0][3])*(s[k2][3]-s[0][3]))+(s[k2][4]-s[0][4])*(s[k2][4]-s[0][4])); u2=k2; } } //printf("%5lf",z); //printf("%d",k+1); for(m2=a2+7;m2<=a2+50;m2++) { if(sqrt((s[m2][2]*s[m2][2])+((s[m2][3])*(s[m2][3]))+(s[m2][4]*s[m2][4]))>p2) { p2=sqrt((s[m2][2]-s[0][2])*(s[m2][2]-s[0][2])+(s[m2][3]-s[0][3])*(s[m2][3]-s[0][3])+(s[m2][4]-s[0][4])*(s[m2][4]-s[0][4])); y2=m2; } } printf("%5lf%5lf%5lf%5d%\n",sqrt((s[a2-1][2]*s[a2-1][2])+((s[a2-1][3])*(s[a2-1][3]))+(s[a2-1][4]*s[a2-1][4])),z2,p2,m2); r=sqrt((s[a2-1][2]-s[0][2])*(s[a2-1][2]-s[0][2])+(s[a2-1][3]-s[0][3])*(s[a2-1][3]-s[0][3])+(s[a2-1][4]-s[0][4])*(s[a2-1][4]-s[0][4])); fclose(fin);
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- 和泉 博(@hiroshi09s)
- ベストアンサー率54% (59/109)
カンマ(,)で区切られたcsvファイルですよね? 読み込み段階でのエラーじゃないですかね。 csvはカンマで区切られているので、その内容の展開にあわせて fscanf() を書いてみてください。↓にファイル読み込みの定番プログラム例を上げておきます。なお、実際に正しく読み込まれているか面倒でも printf()で確認してから、次の for()計算に移るとより確実ですよ。 // ---- プログラム省略 ---- if((fin=fopen("13.csv","r"))==NULL) { printf("入力ファイルがオープンできません.\n"); exit(1); } i2 = 0; /* (tenb, 42885415, 123, 255, 236) 等の1行につき fscanf() を展開すること */ fscanf(fin, "%s, %lf, %lf, %lf, %lf", &n[i2][0], &s[i2][0], &s[i2][1], &s[i2][2], &s[i2][3]); //printf("%d: %s %lf %lf %lf %lf\n", i2, n[i2][0], s[i2][0], ....); while(!feof(fin)) { i2++; //if (i2 > 5) break; //←チェック用ですから確認後削除のこと fscanf(fin, "%s, %lf, %lf, %lf, %lf", &n[i2][0], &s[i2][0], &s[i2][1], &s[i2][2], &s[i2][3]); //printf("%d: %s %lf %lf %lf %lf\n", i2, n[i2][0], s[i2][0], ....); } //exit(0); for(i2=0;i2<=2000;i2++) { g2=sqrt((s[i2][2]*s[i2][2])+((s[i2][3])*(s[i2][3]))+(s[i2][4]*s[i2][4])); if(g2>max2 && g2<5000) { max2=g2; a2=i2; } } // ---- プログラム省略 ----
- hidebun
- ベストアンサー率50% (92/181)
タイトルはC/C++に関係していないので、 タイトルの内容、「卒論」について回答させていただくと、 「卒論は、自らもしくは共著者とともに」作成するのが普通です。 ここで回答してくれる人を全員共著者にされるおつもりなんでしょうか? もしくは謝辞に入れるとか。 >本当に困っていますどうか助けてください。 こういった質問は、本当に困ってしまいます。 何に困っているかさっぱりわかりません。助けて下さい。 参考URL:卒業論文 http://ja.wikipedia.org/wiki/%E5%8D%92%E6%A5%AD%E8%AB%96%E6%96%87
- bluecampus
- ベストアンサー率66% (138/209)
何がどのようにうまくいかないのでしょうか?