• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数テキストファイルを読み込み、複数テキストファイルの出力)

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

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

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

  • ベストアンサー
  • 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