電子書籍の厳選無料作品が豊富!

こんばんわ。質問があります。Cでのファイルの入出力についてなんですが、「fscanf」と「fprintf」を用いてあるデータファイルからデータを取り込んで処理をしてファイルに書き出すプログラムを作成したのですが、私が作成したプログラムの場合、まずfscanfでファイルをすべて読み込んでしまって、それから処理をして書き出すというプログラムなのですが、この方法ではなく、はじめに最初の1行だけを読みこんでその1行だけを処理して書き出し、次に2行目だけを読み込んで処理して書き出し、そして3行目を読み込んで処理・・・・という風に1行ごとに読み込みおよび書き込みを行っていくプログラムを作成したいのですがどのようにプログラムを組んでよいのか分かりません。アドバイスがいただけると幸いです。よろしくお願いいたします。

ちなみに私が作成したプログラムは下記のようなものです。

#include <stdio.h>
#define NDATA 10000
#define NMAX 40

main()
{
double x[NDATA], y[NDATA], z[NDATA];
double xx[NDATA], yy[NDATA], zz[NDATA];
int i, n=0
FILE *in_file, *out_file;
char in_filename[NMAX], out_filename[NMAX];

printf("Input filename: ");
scanf("%s", in_filename);
in_file = fopen(in_filename, "r");
while(fscanf(in_file, "%lf %lf %lf", &(x[n]), &(y[n]), &(z[n])) != EOF)
n++;
fclose(in_file);

for(i=0; i<n; i++)
xx[i] = x[i]*y[i];
yy[i] = y[i]*z[i];
zz[i] = z[i]*x[i];

printf("Output filename: ");
scanf("%s", out_filename);
out_file = fopen(out_filename, "w");
for(i=0; i<n; i++)
fprintf(out_file, "%f %f %f\n", xx[i], yy[i], zz[i]);
fclose(out_file);
}

A 回答 (2件)

#include <stdio.h>


#define NMAX 256

main()
{
double x,y,z;
double xx,yy,zz;

int i, n=0
FILE *in_file, *out_file;
char in_filename[NMAX], out_filename[NMAX];

printf("Input filename: ");
scanf("%s", in_filename);
in_file = fopen(in_filename, "r");

printf("Output filename: ");
scanf("%s", out_filename);
out_file = fopen(out_filename, "w");

while(fscanf(in_file, "%lf %lf %lf", &x, &y, &z) != EOF){
xx = x*y;
yy = y*z;
zz = z*x;

fprintf(out_file, "%f %f %f\n", xx, yy, zz);
}
fclose(in_file);
fclose(out_file);
}

in_fileへのアクセスと、out_fileへのアクセスは同時にできます。従って、in_fileから一行読み込んだら、その場で計算して結果をout_fileに出力してしまえばよいのです。すると、x[n]のような配列で、メモリにデータを溜めなくても、データを処理できます。

xx = x*y;
yy = y*z;
zz = z*x;
fprintf(out_file, "%f %f %f\n", xx, yy, zz);

ここは、
fprintf(out_file, "%f %f %f\n", x*y, y*z, z*x);
とすれば、xx,yy,zzもいりません。

あと、NMAXは、256ぐらいにしておいた方がいいですよ。scanfは危険な関数で、NMAXを超えた文字列を入力すると、プログラムが書き換えられて、異常終了しますから。本当は使わない方がいいんですけど、めんどくさいので、このままでいいでしょう。
    • good
    • 0
この回答へのお礼

とても丁寧なご回答ありがとうございます。おかげさまで問題は解決しました。NMAXについてのご指摘もありがとうございました。

お礼日時:2005/02/01 15:44

ここまで出来てて、どうして悩んでいるのか不思議なんですが…。



質問に書いてあるプログラムを切り貼りすれば出来ますよ。

元のプログラムを切り貼りして、以下のフロー通りに書いてみましょう。

入力ファイル名をscanfする
入力ファイルをfopenする
出力ファイル名をscanfする
出力ファイルをfopenする
入力ファイルからx,y,zにfscanfして、EOFにならない間は {
 xxにx*yを代入
 yyにy*zを代入
 zzにz*xを代入
 出力ファイルにxx,yy,zzをfprintfする
}
入力ファイルをfcloseする
出力ファイルをfcloseする
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。勉強不足ですみません。もっと勉強したいと思います。最初に配列という風に考えてしまってそれが頭から抜けなかった様です。どうもありがとうございました。

お礼日時:2005/02/01 15:49

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