複数テキストファイルを読み込み、複数テキストファイルの出力

このQ&Aのポイント
  • 質問は100個のテキストファイルを読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するプログラムについての質問です。
  • 現在のプログラムでは、1つのテキストファイルしか読み込めないため、16_4.batを作成して複数のテキストファイルを読み込もうとしましたが、うまくいきませんでした。
  • どのようにすれば複数のテキストファイルを読み込み、出力することができるでしょうか?
回答を見る
  • ベストアンサー

複数テキストファイルを読み込み、複数テキストファイルの出力

質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>read_dataの呼び出しは上位レベルのものを直接 >sprintf(fname,,"ss[%d].txt",1+i); >の後に代入すればよいでしょうか? 私には、上位レベルがどうなっているのかわかりませんので、判断がつきませんが、その前の方がいいと思います。 例: for(i=0;i<100;i++) sprintf(fname,"読み込むテキストファイル名%d.txt",i+1); fp=fopen(fname,"r"); read_data(fp); /* リターン値を使う必要あり? */ fclose(fp); sprintf(fname,"ss[%d].txt",1+i);

kenkenkenken25
質問者

お礼

sprintf(fname,"arco%d.txt",i+1); fp=fopen(fname1,"r"); read_data(fp); /* リターン値を使う必要あり? */ fclose(fp); としていましたが、fnameの部分をfname1にする、つまり以下のようにすることで結果は出力されるようになりました。 sprintf(fname1,"arco%d.txt",i+1); ただ、プログラムを動かすと Debug Assertion Failed! と出てしまいます。これを無視すれば結果は出力されるのですが、これをなくすにはどうすれば良いのでしょうか?BLUEPIXYさんのおっしゃるとおり、リターン値を使う必要があるのでしょうか?

kenkenkenken25
質問者

補足

作ってみましたが、うまくいきませんでした。やはり読み込むところがうまくいっていないような気がします。 #include <math.h> #include <stdio.h> #define DATA_MAX 20 #define CH 1 static double data[CH][DATA_MAX]; int read_data(fp) FILE *fp; { int i=0; while(1){ for(i=0;i<DATA_MAX;i++){ fscanf(fp,"%lf",&data[0][i]); if(feof(fp)!=0) break; } return i; } } /************************************************/ void ecg_rr(fp,data_max) FILE *fp; { int i=0; int c=1; char fname[64]; char fname1[64]; for(i=0;i<100;i++) { sprintf(fname,"arco%d.txt",i+1); fp=fopen(fname1,"r"); read_data(fp); /* リターン値を使う必要あり? */ fclose(fp); /****データ出力*********/ sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); sprintf(fname,"ks[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][8]); fprintf(fp,"%8.8f\n",data[0][10]); fprintf(fp,"%8.8f\n",data[0][12]); fprintf(fp,"%8.8f\n",data[0][14]); sprintf(fname,"kk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][9]); fprintf(fp,"%8.8f\n",data[0][11]); fprintf(fp,"%8.8f\n",data[0][13]); fprintf(fp,"%8.8f\n",data[0][15]); fclose(fp); } } /*****************メイン関数*******************/ void main(argc,argv) int argc; char *argv[]; { int data_max; FILE *fp1,*fp2; if(argc!=3){ printf("damy damy RR \n"); exit(0); } if((fp1=fopen(argv[1],"r")) == NULL){ printf("Can't open the file\n"); exit(2); } if((fp2=fopen(argv[2],"w"))==NULL){ printf("Can't create the output file of ECG_RR\n"); exit(3); } data_max=read_data(fp1); printf("%d\n",data_max); fclose(fp1); ecg_rr(fp2,data_max); fclose(fp2); }

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>Xの部分は100個のファイルを表しているのではないと思います。 なるほど、確かにそうですね。 CH 1 が1つだけなのに、なんでわざわざ確保しているのかというと、こうした(読み込みファイル数を増やす)拡張のためのような気がしますが… とりあえず、1つのファイルを読み込みできる関数があるということなので、 データを溜め込みしないということであれば、 ファイルが1つ読み終わった時に出力しないといけません。なので、こうした読み込みや書き込みの関数の上位レベルでそうしたコントロールをするか、 特に分ける必要がないなら、 この出力する関数の中で、読み込みをしながら、書き出しを行う様にすればいいと思います。 for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); の間で、読み込むファイル名(ループ毎に1つのファイル名が決まる様にする)を作ってオープンして read_dataを呼び出します。 そしてファイルクローズします。 まあ、やり方としては色々考えられると思うので、 まずは、方針(どう処理するのか)決めないといけません。(あれこれ言っても、ここはこれを使うというのがあって変更できないかもしれませんし) ----------------------------------------------- 蛇足 >ecg_rr(fp,data_max) で質問文の関数は呼び出されていますが、渡されたfpは利用されていないし、この関数内で代入されてしまっているので、引数として渡す意味が無いように思います。また、data_maxも利用されていません。 >data[0][i]=trend_data[0][i]; をする意味はまるで無いように思います。

kenkenkenken25
質問者

補足

ご回答ありがとうございます。 read_dataの呼び出しは上位レベルのものを直接 sprintf(fname,,"ss[%d].txt",1+i); の後に代入すればよいでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ちょっと良く分からない部分があるのですが、 質問文のプログラムの時点で、 data[X][i]の iの部分が各ファイルの10個のデータだとすると、 Xの部分が各ファイル0~99の100個のファイルを表しているのではないですか? そうして、既にデータが読み込みできているなら data[0][n]の部分を data[i][n]にすればいいだけのような気がします。 本当に読み込みができていないのだったら、読み込みの部分を補足して下さい。 ファイル名に規則性があるなら、単にファイル名を変えながら読み込むだけですので、1つのファイルに関して読み込みできているなら、同じように繰り返しの処理にできます。

kenkenkenken25
質問者

補足

読み込みの部分は以下の通りです。Xの部分は100個のファイルを表しているのではないと思います。 ファイルは1つ読み込んでいるだけになっています。 わかりづらくて申し訳ないです。 #include <math.h> #include <stdio.h> #define DATA_MAX 100000 #define CH 1 static double data[CH][DATA_MAX],trend_data[CH][DATA_MAX]; int read_data(fp) FILE *fp;{ int i,j=0; while(1){ for(j=0;j<DATA_MAX;j++){ for(i=0;i<CH;i++){ /* fscanf(fp,"%8.6lf",&data[i][j]); */ fscanf(fp,"%lf",&data[i][j]); } /* j++; */ if(feof(fp)!=0) break; } return j; } } void trend_rr(data_max) { int m,i; for(m=0;m<CH;m++){ for(i=0;i<data_max;i++){ trend_data[m][i]=data[m][i]; } } }

関連するQ&A

  • 複数ファイルの出力

    質問があります。1600個のデータを読み込んで(16個ずつの組で100組)、1番目、3番目、5番目、7番目のデータをss[1].txtとして出力し、同様に2番目、4番目、6番目、8番目のデータをsk[1].txt、9番目、11番目、13番目、15番目のデータをks[1].txt、10番目、12番目、14番目、16番目のデータをkk[1].txtとして出力させます。以下、ss[2].txt,sk[2].txt,ks[2].txt,kk[2].txt・・・に関してはそれぞれ直前のファイルに16を足したデータ(例えばss[2].txtなら、17番目、19番目、21番目、23番目のデータを出力)を出力させるというプログラムです。 以下に自分で作ったプログラムを掲載します。 void ecg_rr(fp,data_max) FILE *fp; { int i,j=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i,j=0;i<100,j<100;i++,j++) { sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0+j*16]); fprintf(fp,"%8.8f\n",data[0][2+j*16]); fprintf(fp,"%8.8f\n",data[0][4+j*16]); fprintf(fp,"%8.8f\n",data[0][6+j*16]); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1+j*16]); fprintf(fp,"%8.8f\n",data[0][3+j*16]); fprintf(fp,"%8.8f\n",data[0][5+j*16]); fprintf(fp,"%8.8f\n",data[0][9+j*16]); fclose(fp); /*ks,kkに関しても同様*/ } } これだと100個ずつファイルを出力できるのですが、データが全て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 <string.h> main() { char text[100]; char a[20], b[20], c[20], d[20], e[20], f[20]; char fname[20]; int i = 1; FILE *fp; printf("■ファイル名>>"); scanf("%s",fname); fp=fopen(fname,"r"); if((fp = fopen(fname,"r")) == NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } else{ printf("ファイルをオープンしました。\n"); } while( fscanf(fp, "%s", text) != EOF){ sscanf(text, "%[^,], %[^,], %[^,], %[^,], %[^,], %[^\0]", a, b, c ,d, e, f); printf("%d回目\n",i++); printf("全文:%s\n",text); printf("1つ目:%s\n",a); printf("2つ目:%s\n",b); printf("3つ目:%s\n",c); printf("4つ目:%s\n",d); printf("5つ目:%s\n",e); printf("6つ目:%s\n\n",f); } } テキストファイル ABCD,EFGH,IJKL,MNOP,QRST,UVWXWZ abcd,efgh,ijkl,mnop,qrst,uvwxyz あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの,はひふへほ テキストファイルから文字列を読み込み、変換させて出力させた内容を他のテキストファイルに保存するにはどのようにしたらいいのでしょうか?

  • プログラムが動きません。

    以前動いていたプログラムが動かなくなりました。 プログラムは3個のtxtファイル(2×2のデータ)で第1列の絶対値和、第2列の絶対値和を求め、1つのtxtファイルとして出力するものです。 #include <stdio.h> #define DATA_MAX 4 #define CH 2 static double data[CH][DATA_MAX]; int read_data(fp) FILE *fp;{ int i,j=0; while(1){ for(j=0;j<DATA_MAX;j++){ for(i=0;i<CH;i++){ fscanf(fp,"%lf",&data[i][j]); } if(feof(fp)!=0) break; } return j; } } void ecg_rr(fp,data_max) FILE *fp; { int i=0; char fname[64]; char fname1[64]; for(i=0;i<3;i++) { sprintf(fname1,"k%d.txt",i+1); fp = fopen(fname1,"r"); read_data(fp); fclose(fp); sprintf(fname,"sum.txt"); fp = fopen(fname,"a"); if(data[0][0]<0){data[0][0]=-data[0][0];} else{data[0][0]=data[0][0];} if(data[0][1]<0){data[0][1]=-data[0][1];} else{data[0][1]=data[0][1];} if(data[1][0]<0){data[1][0]=-data[1][0];} else{data[1][0]=data[1][0];} if(data[1][1]<0){data[1][1]=-data[1][1];} else{data[1][1]=data[1][1];} data[0][i]=data[0][0]+data[0][1]; data[1][i]=data[1][0]+data[1][1]; fprintf(fp,"%8.8f %8.8f\n",data[0][i],data[1][i]); fclose(fp); } } メイン関数には問題がないので省略しましたが、ここまでで問題というところはあるでしょうか?

  • ファイル名を複数個配列で確保したいときどうすればいいですか?

    先ほど似た質問をしたのですが、勘違いしていたので質問しなおさせてください。 typedef struct file{ FILE *fp; char *filename; }sFILE; sFILE fp[5]; for(i=0;i<5;i++){ fp[i].fp=NULL; sprintf(fp[i].filename,"file(%d).txt",i); } とsprintfでファイル名を確保したいんですが、 sprintf(fp[i].filename,"file(%d).txt",i); の第一引数がこれではダメなようです。 なんとなく、ダメなのは分かるんですがアドレスについてなど分からないことが多くどうしたらいいのかわかりません。 アドバイス等お願いします。

  • ファイルの入出力で困っています(C言語)

    はじめまして、nathan3と申します。 昔、さらっとC言語を学んでいたので、仕事場でも活用できればと思い、勉強しなおしています。 以下のプログラムですが、コンパイルはするものの、実行がなされません。 sprintfをつかってファイルを作り、fprintfで読み込み、countで繰り返し別名のファイルを読み込み・作成し…といったプログラムを書いているつもりです。 調べながら書いた稚拙なプログラムですが、ここがちがう!というところをお教えいただけると大変助かります。 #include <stdio.h> int main(void){ FILE *fp,*fo; char *fname1; char *fname2; char s[100],t[100]; int ret,count; for(count = 0 ; count < 3 ; count++) { sprintf(fname1, "sankasha%d.txt", count); fp = fopen(fname1, "r"); if (fp == NULL){ printf("%s can't open a file\n", fname1); return -1; } sprintf(fname2, "matome%d.txt", count); fo = fopen(fname2,"w"); if (fo == NULL){ printf("%s can't open a file\n", fname2); return -1; } printf("--fscanf---"); while( (ret = fscanf(fp,"%[^,],%s", s, t)) != EOF ){ fprintf(fo,"%s ", t); } } fclose(fo); fclose(fp); return 0; } 何度見直しても間違いが見つからず困窮しております。 どうぞ、みなさまのお力をお貸しください! よろしくお願いいたします。

  • ファイルをオープンするときのエラー

    C言語であるファイルにある数値を100ごとに合計して,ほかのファイルに書き出す。しかし,実行するとエラーでてきます。原因はわからないです。因みに,オープンしたいファイルをほかのディレクリに置いたら,ファイルが見付かりませんとのエラーがありました、WindowsのC言語でカレントディレクトリを探すときは何の関数を使えばいいでしょうか? int main(void) { int i,k; int num; char filename[64],fileread[64],filewrite[64]; FILE *fp0,*fp1; double sum1,sum2,sum3; int *ch[3]; sum1=sum2=sum3=0.0; printf("ファイル名を入力ください!\n"); scanf("%s",filename); fprintf(stderr,"\n%s\n",filename); sprintf(fileread,"C:\\%s.txt",filename); fprintf(stderr,"%s\n",fileread); sprintf(filewrite,"C:\\%s.csv",filename); for (i=0;i<3;i++) { if ( (ch[i]=(int *)malloc(4*30))==NULL ) { fprintf(stderr,"Cannot get memory <ch[%d]>.",i); return -1; } } fprintf(stderr,"%s\n",filewrite); if ((fp0=fopen(fileread,"rb"))==NULL) { fprintf(stderr,"Cannot open file %s\n",fileread); return 0; } fscanf(fp0,"%d", &num); if((fp1=fopen(filewrite,"wb"))==NULL) { fprintf(stderr,"Cannot open file!%s\n",filewrite); return 0; } for(i=0;i<50;i++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); } for(i=0;i<num/100;i++) { for (k=0;k<100;k++) { fscanf(fp0,"%d %d %d",*(ch[0]),*(ch[1]),*(ch[2])); if ( feof(fp0) != 0 ) break; sum1=sum1+*(ch[0]); sum2=sum2+*(ch[1]); sum3=sum3+*(ch[2]); } fprintf(fp1,"%d %d %d\n",sum1,sum2,sum3); } fclose(fp0); fclose(fp1); return 0; }

  • ファイルの入出力

    学生です。まだ習い始めて間もないのですがよろしくお願いします。 27.000000,207.000000,116.000000 48.000000,90.000000,116.000000 48.000000,90.000000,116.000000       : テキストの中にある上記のカンマ区切りのデータをfscanfで読み込んで違うテキストに同じ数値を出力したいのですがうまく出力できません。 0.000000,0.000000,+NAN 0.000000,0.000000,+NAN 0.000000,0.000000,+NAN      : 数値は上記のように出力されてしまいます。 プログラムは以下の通りです。 main() { FILE *fp; double m[30][3]; int i,j; double e1,e2,e3; fp=fopen("data00.txt","r"); for(i=0;i<30;i++){  fscanf(fp,"%f,%f,%f\n",&e1,&e2,&e3);  m[i][0]=e1;  m[i][1]=e2;  m[i][2]=e3; } fclose(fp); fp=fopen("data01.txt","w"); for(j=0;j<30;j++){  fprintf(fp,"%f,%f,%f\n",m[j][0],m[j][1],m[j][2]); } fclose(fp); getch(); exit(0); } データの読み込みがうまくいってないのだと思いますがわかりません。 間違いがあったならご指摘お願いします。

  • バイナリファイルをテキストファイルに変換する方法を教えて頂けませんか。

    こんにちは。 バイナリファイルをテキストファイルのように読み込んだり、書き込んだりすることは可能でしょうか。バイナリファイルをテキストファイルとして扱う良い方法があれば是非ご教授頂きたいです。 以下は自分なりに考えたプログラムなのですが、すごく文字化けして出力されてしまいます。どこがいけないんでしょうか。 ####プログラム#### #include<stdio.h> int main(){ FILE *fp,*fp2; char str[1024]; //file.txtはバイナリファイルなのでバイナリモードで開く if((fp = fopen("file.txt","rb")) == NULL){ printf("file.txt:open error"); exit(-1); } //out.txtはテキストファイルとして保存したいのでテキストモードで開く if((fp2 = fopen("out.txt","at")) == NULL){ printf("out.txt:open error"); exit(-1); } //一行ずつバイナリファイルをテキストファイルにして保存 while((fgets(str,1024,fp)) != NULL){ printf("%s\n",str); fprintf(fp2,"%s\n",str); } fclose(fp); fclose(fp2); return 0; } ####ここまで#### 以下が出力されたテキストファイル(out.txt)です。 ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI&egrave;&Ccedil; ^A^Dc ^A^D^L<87> ^Y<98>X^?m?;^D&ordm;?^QI0g 酷い文字化けを起こしてしまっています。 解決方法をご存知であれば教えて頂けないでしょうか。どうぞよろしくお願いします。

  • fprintfで出力するファイルのパス指定について

    cで以下のコードを書いています。 file.txtを任意の場所に作りたいのですが どうすればいいのでしょうか。 fopen("c:\file.txt", "r"))と書くとエラーになって しまいました。 void main(void) { FILE *fp; if ((fp = fopen("file.txt", "r")) == NULL) { fprintf ( stderr, "err\n" ); exit (2); } fprintf(fp,"%s\n",a);; fclose(fp); }

専門家に質問してみよう