こんばんわ。質問があります。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);
}
No.2
- 回答日時:
ここまで出来てて、どうして悩んでいるのか不思議なんですが…。
質問に書いてあるプログラムを切り貼りすれば出来ますよ。
元のプログラムを切り貼りして、以下のフロー通りに書いてみましょう。
入力ファイル名をscanfする
入力ファイルをfopenする
出力ファイル名をscanfする
出力ファイルをfopenする
入力ファイルからx,y,zにfscanfして、EOFにならない間は {
xxにx*yを代入
yyにy*zを代入
zzにz*xを代入
出力ファイルにxx,yy,zzをfprintfする
}
入力ファイルをfcloseする
出力ファイルをfcloseする
ご回答ありがとうございます。勉強不足ですみません。もっと勉強したいと思います。最初に配列という風に考えてしまってそれが頭から抜けなかった様です。どうもありがとうございました。
No.1ベストアンサー
- 回答日時:
#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を超えた文字列を入力すると、プログラムが書き換えられて、異常終了しますから。本当は使わない方がいいんですけど、めんどくさいので、このままでいいでしょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlにおけるファイルコピー方法
-
Firefox で file:// で始まる U...
-
perl ファイルが開かない
-
XML::Parserの parsefileの結果...
-
Perlで特定行から特定行までを...
-
VBAでCSVファイルの特定行を書...
-
batファイルでrenameができませ...
-
エクセルVBA コードが同じでも...
-
ExcelをCSV書き出す場合のシー...
-
ifstream/ofstream について
-
VBAでCSVファイルを途中行まで...
-
fopenでディレクトリ内の全ファ...
-
chdirがうまくできない
-
open中のファイルをrename
-
FindFirstFileとFindNextFileで...
-
ファイル名を複数個配列で確保...
-
VBAでタブ区切りテキストの保存...
-
makefileでファイルをコピー(...
-
sprintfについて
-
openした後、closeしないでプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python renameについて
-
window.open でのファイル指定方法
-
MATLABのm-fileについて
-
fgets で値が取得できない
-
csvファイルの横方向への改行に...
-
巨大なテキストの最終行を取得...
-
Firefox で file:// で始まる U...
-
JSP URLに表示される拡張子 .jsp
-
重複ファイル名ある場合ファイ...
-
ファイルの存在の有無を確かめ...
-
ファイル全てを .xlsm に変更し...
-
PerlでのUseless use...
-
行を指定して削除する方法PERL
-
VBA テキストファイルを読み取...
-
HTMLのフォームで画像と文...
-
perl ファイルが開かない
-
並び方、
-
read() on unopened filehandle...
-
drtファイルはどうしたら開...
-
VBAコードを張り付け後のエクセ...
おすすめ情報