![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_12.png?e8efa67)
こんばんわ。質問があります。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.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を超えた文字列を入力すると、プログラムが書き換えられて、異常終了しますから。本当は使わない方がいいんですけど、めんどくさいので、このままでいいでしょう。
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する
ご回答ありがとうございます。勉強不足ですみません。もっと勉強したいと思います。最初に配列という風に考えてしまってそれが頭から抜けなかった様です。どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- その他(プログラミング・Web制作) pythonのエラーについて 2 2022/08/17 17:17
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
window.open でのファイル指定方法
-
fgets で値が取得できない
-
MATLABのm-fileについて
-
ファイルの存在の有無を確かめ...
-
【C++/CLI】ファイルオープンに...
-
VBA テキストファイルを読み取...
-
csvファイルの横方向への改行に...
-
行を指定して削除する方法PERL
-
fortranのopen文について。
-
数を指定してレコードを保存
-
drtファイルはどうしたら開...
-
awkスクリプトでダブルクォーテ...
-
エクセルVBAで素数だけを出力す...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
VBAで巨大なファイルの途中から...
-
VBAでCSVファイルを途中行まで...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
-
エクセルVBA コードが同じでも...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python renameについて
-
fgets で値が取得できない
-
window.open でのファイル指定方法
-
巨大なテキストの最終行を取得...
-
ファイル全てを .xlsm に変更し...
-
read() on unopened filehandle...
-
csvファイルの横方向への改行に...
-
VBAコードを張り付け後のエクセ...
-
Firefox で file:// で始まる U...
-
JSP URLに表示される拡張子 .jsp
-
drtファイルはどうしたら開...
-
並び方、
-
重複ファイル名ある場合ファイ...
-
VBA テキストファイルを読み取...
-
cgiでサーバーにファイルを追加...
-
HTMLのフォームで画像と文...
-
WindowsでPerlをする際,1行目の...
-
バイナリファイルの出力
-
Perlでのパーミッション変更の仕方
-
foreach内での変数の扱い?
おすすめ情報