- ベストアンサー
Cでのファイルからの入力およびファイルへの出力
こんばんわ。質問があります。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); }
- みんなの回答 (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を超えた文字列を入力すると、プログラムが書き換えられて、異常終了しますから。本当は使わない方がいいんですけど、めんどくさいので、このままでいいでしょう。
その他の回答 (1)
- chie65536
- ベストアンサー率41% (2512/6032)
ここまで出来てて、どうして悩んでいるのか不思議なんですが…。 質問に書いてあるプログラムを切り貼りすれば出来ますよ。 元のプログラムを切り貼りして、以下のフロー通りに書いてみましょう。 入力ファイル名をscanfする 入力ファイルをfopenする 出力ファイル名をscanfする 出力ファイルをfopenする 入力ファイルからx,y,zにfscanfして、EOFにならない間は { xxにx*yを代入 yyにy*zを代入 zzにz*xを代入 出力ファイルにxx,yy,zzをfprintfする } 入力ファイルをfcloseする 出力ファイルをfcloseする
お礼
ご回答ありがとうございます。勉強不足ですみません。もっと勉強したいと思います。最初に配列という風に考えてしまってそれが頭から抜けなかった様です。どうもありがとうございました。
お礼
とても丁寧なご回答ありがとうございます。おかげさまで問題は解決しました。NMAXについてのご指摘もありがとうございました。