アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問は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]
・・・
とやったのですが、うまくいきませんでした。
どうすればよいのでしょうか。

A 回答 (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);

この回答への補足

作ってみましたが、うまくいきませんでした。やはり読み込むところがうまくいっていないような気がします。

#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);

}

補足日時:2005/05/16 12:51
    • good
    • 0
この回答へのお礼

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さんのおっしゃるとおり、リターン値を使う必要があるのでしょうか?

お礼日時:2005/05/16 13:39

>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];
をする意味はまるで無いように思います。

この回答への補足

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

補足日時:2005/05/15 10:01
    • good
    • 0

ちょっと良く分からない部分があるのですが、


質問文のプログラムの時点で、
data[X][i]の
iの部分が各ファイルの10個のデータだとすると、
Xの部分が各ファイル0~99の100個のファイルを表しているのではないですか?
そうして、既にデータが読み込みできているなら
data[0][n]の部分を
data[i][n]にすればいいだけのような気がします。

本当に読み込みができていないのだったら、読み込みの部分を補足して下さい。
ファイル名に規則性があるなら、単にファイル名を変えながら読み込むだけですので、1つのファイルに関して読み込みできているなら、同じように繰り返しの処理にできます。

この回答への補足

読み込みの部分は以下の通りです。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];
}
}

}

補足日時:2005/05/15 00:57
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!