- ベストアンサー
ファイル結合
現在、テキストファイルの結合で困っています。 test1.txt test2.txt・・・・・・test*.txtのファイルがあり それぞれのファイルには縦に1列、数値が500個入っています。 test1.txtの中身(例) 0.3 0.5 0.8 0.6 0.2 0.8 それを以下のように結合したいのですがうまくいきません 0.3 0.8 0.2・・・・・・ 1.9 0.5 0.8 0.7・・・・・・ 0.1 0.8 ・ 0.6 ・ 0.2 ・ 0.8 0.5 0.4・・・・・・ 0.7 参考書のプログラムを参考に作ってみたのですが途中でずれてしまうのです そのプログラムを載せるべきかもしれませんが、大部分が参考書のままなので今のところ載せてません こんな状態では難しいとは思われるのですが、どうかアドバイスをお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと勘違いしてましたね。 3つの結合なら、こんな感じですかね。 fgets(dx1,256,fp1); fgets(dx2,256,fp2); fgets(dx3,256,fp3); sprintf(dy,"% 10.6lf % 10.6lf % 10.6lf",atof(dx1),atof(dx2),atof(dx3)); fputs(dy,fp4);
その他の回答 (5)
- cherry_moon
- ベストアンサー率36% (37/102)
ft2 と ft3 が同じファイル名になってたり、 fp3をリードで開いてfputsしてたり、 ちょこちょこ間違いがありますよ。 sprintf(ft1,"test%d.txt",j-1); sprintf(ft2,"test%d.txt",j); sprintf(ft3,"test%d.txt",j); if((fp1=fopen(ft1,"r"))==NULL){ if((fp2=fopen(ft2,"r"))==NULL){ if((fp3=fopen(ft3,"r+"))==NULL){ if((ie1=fgets(dx1,256,fp1))==NULL) {error(1,i,ie1);exit(-1);} if((ie2=fgets(dx2,256,fp2))==NULL) {error(2,i,ie2);exit(-1);} fputs(dy,fp3);
お礼
ご指摘ありがとうございます 自分としては、これで、forで回して指定した数だけファイルを結合できるかと思ったのですが 駄目なんですね、考え直してみます
- JaritenCat
- ベストアンサー率37% (122/322)
strlen→strcpy→strcatの変わりに、読み込んだ文字列を一旦数値に変換して、sprintfでdyに書き出してはいかがでしょう。 sprintf(dv,"% 4.6lf% 4.6lf",atof(dx1),atof(dx2));
お礼
やってみます。 アドバイスありがとうございます
補足
やってみたのですが、うまくいきません 例えば、3つのファイルを結合した場合は 最終的に出力されたファイルには3列表示されるようにしたいのですが 何か間違えてるのでしょうが、2列しか表示されないのです
- rot-N
- ベストアンサー率27% (118/432)
テキストを読んで数値にして、その後、printf()で、小数点以上の桁数と小数点以下の桁数を指定して出力しては?
お礼
アドバイスありがとうございます
補足
自分の説明が下手なのでプログラムを乗せます 下のプログラムではtest1.txt、test2.txt、test3.txt の3ファイルを結合したのがtest3.txtという名前で保存されるようにしています FILE *fp1,*fp2,*fp3; char ft1[15],ft2[15],ft3[15],dx1[256],dx2[256],dy[256]; int i,len,j; char *ie1,*ie2; for(j=2;j<=3;j++){ sprintf(ft1,"test%d.txt",j-1); sprintf(ft2,"test%d.txt",j); sprintf(ft3,"test%d.txt",j); if((fp1=fopen(ft1,"r"))==NULL){ printf("ファイル1が開けません\n"); exit(-1); } if((fp2=fopen(ft2,"r"))==NULL){ printf("ファイル2が開けません\n"); exit(-1); } if((fp3=fopen(ft3,"r+"))==NULL){ printf("ファイル3が開けません\n"); exit(-1); } for(i=0; i<500; i++){ if((ie1=fgets(dx1,256,fp1))==NULL) {error(1,i,ie1);exit(-1);} if((ie2=fgets(dx2,256,fp2))==NULL) {error(2,i,ie2);exit(-1);} len=strlen(dx1);dx1[len-1]='\0'; strcpy(dy,dx1); strcat(dy,dx2); fputs(dy,fp3); } fclose(fp1);fclose(fp2);fclose(fp3); } printf("終了"); return 0;
- graduate_student
- ベストアンサー率22% (162/733)
>途中でずれてしまうのです 小数点以下がそろってないのですか?
補足
わかりにくい書き方ですみません プログラムを実行すると -0.518600 -0.389000 -0.376500 -0.389000 -0.376500 -0.389000 このように途中まではなっているようなのですが 途中から -0.000100 00100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 -0.000100 このようになってしまうんです わかりにくいと思いますがよろしくお願いします
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
以下のように……って、結合規則がさっぱりわかりません。
お礼
説明べたですみません。 ご指摘ありがとうございます
補足
すみません 全てのファイルに縦一列に数値が入ってるので 例えば test1.txtに 4 4 4 4 4 test2.txtに 5 5 5 5 5 となっていたら outfile.txtに 4 5 4 5 4 5 4 5 4 5 と出力されるようにしたいのです
お礼
たびたび申し訳ありません 試してみたいと思います