ページ 11

ファイルからデータの読み込み

Posted: 2009年8月11日(火) 14:12
by Eda
テンプレに沿って質問させていただきます。
[1] 質問文
 [1.1] 自分が今行いたい事は何か
    ファイルからデータの読み込み
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
    数値計算のために必要なデータの読み込みが上手くいきません。
    下にそのプログラムを簡単にモデル化したものを示します。
    これは読み込んだものをそのまま出力するプログラムのつもりです。
#include <stdio.h>
#include <math.h>
#define B 3600
#define Q 10
/*****************************/
int main()
{
	int i,PN,M1;
	double U0,H,K,KD0[Q],KD1[Q],KD2[Q],KD3[Q],KD4[Q],KV0[Q],KV1[Q],KV2[Q];
	double R0[Q],R01[Q],R2[Q],R3[Q],R4[Q],R5[Q],NL[Q],NLC[Q],NH[Q],NHC[Q],HA[Q],JPN[Q];
	FILE *in_file,*out_file;
	char in_filename[Q],out_filename[Q];
	i=0;
	/*read file*/
	printf("Input filename: ");
	scanf("%s",in_filename);
	in_file = fopen(in_filename,"r");
	fscanf(in_file,"%lf%lf%d%lf%d%lf",&H,&K,&PN,&NH,&M1,&U0);
	for(i=0;i<3;i++){
		fscanf(in_file,"%lf%lf%lf%lf%lf",&KD0,&KD1,&KD2,&KD3,&KD4);
	}
	for(i=0;i<3;i++){
		fscanf(in_file,"%lf%lf%lf",&KV0,&KV1,&KV2);
	}
	for(i=0;i<3;i++){
		fscanf(in_file,"%lf%lf%lf%lf%lf%lf",&R0,&R01[i],&R2[i],&R3[i],&R4[i],&R5[i]);
	}
	for(i=0;i<3;i++){
		fscanf(in_file,"%lf%lf%lf%lf",&NL[i],&NLC[i],&NH[i],&NHC[i]);
	}
	for(i=0;i<3;i++){
		fscanf(in_file,"%lf",&HA[i]);
	}
	for(i=0;i<2;i++){
		fscanf(in_file,"%lf",&JPN[i]);
	}
	printf("Output filename: ");
	scanf("%s",out_filename);
	out_file = fopen(out_filename,"w");
	for(i=0;i<3;i++){
		fprintf(out_file,"%lf%lf%lf%lf%lf%lf\n",&H,&K,&PN,&NH[i],&M1,&U0);
	}
	for(i=0;i<3;i++){
		fprintf(out_file,"%lf%lf%lf%lf%lf\n",&KD0[i],&KD1[i],&KD2[i],&KD3[i],&KD4[i]);
	}
	for(i=0;i<3;i++){
		fprintf(out_file,"%lf%lf%lf\n",&KV0[i],&KV1[i],&KV2[i]);
	}
	for(i=0;i<3;i++){
		fprintf(out_file,"%lf%lf%lf%lf%lf\lf\n",&R0[i],&R01[i],&R2[i],&R3[i],&R4[i],&R5[i]);
	}
	for(i=0;i<3;i++){
		fprintf(out_file,"%lf%lf%lf%lf\n",&NL[i],&NLC[i],&NH[i],&NHC[i]);
	}
	for(i=0;i<3;i++){
		fprintf(out_file,"%lf\n",&HA[i]);
	}
	for(i=0;i<1;i++){
		fprintf(out_file,"%lf\n",&JPN[i]);
	}
	fclose(in_file);
	fclose(out_file);
	return 0;
}

 [1.3] どのようなエラーやトラブルで困っているか(コンパイルエラーは無し)
    出力して得られた結果が私の思っているものと異なる。
 [1.4] 今何がわからないのか、知りたいのか

[2] 環境  
 [2.1] OS : WindowsXP
 [2.2] コンパイラ名 :Borand C++
[3] その他
 ・どの程度C言語を理解しているか
大学で軽く習った程度

Re:ファイルからデータの読み込み

Posted: 2009年8月11日(火) 14:17
by Eda
念のため、入力ファイルと出力ファイルも記載します。

入力ファイル
-1.50486915050162E-06 143670.851675779 3 1 2093 -9.57304853288856E-07
-9.57 1 0 0 0
-9.5 1 0 0 0
-9.5 1 0 0 0
8 1 0
8 1 0
8 1 0
1 0 0 0 0 0
1 0 0 0 0 0
-1 0 0 0 0 0
0 0 .25 .25
.45 .45 .55 .549027557934215
.75 .75 1 1.00003160034355
.00000001
.00000001
.00000001
500
595


出力ファイル
0.0000000.0000000.0000000.0000000.0000000.000000
0.0000000.0000000.0000000.0000000.0000000.000000
0.0000000.0000000.0000000.0000000.0000000.000000
0.0000000.0000000.000000+NAN500.000000
0.0000000.0000000.000000+NAN500.000000
0.0000000.0000000.000000+NAN500.000000
0.0000000.000000+NAN
0.0000000.000000+NAN
0.0000000.000000+NAN
0.0000000.0000000.0000000.0000000.000000lf
0.0000000.0000000.0000000.0000000.000000lf
0.0000000.0000000.0000000.0000000.000000lf
0.0000000.0000000.0000000.000000
0.0000000.0000000.0000000.000000
0.0000000.0000000.0000000.000000
0.000000
0.000000
0.000000
0.000000

Re:ファイルからデータの読み込み

Posted: 2009年8月11日(火) 14:54
by pooka
ぱっと見ただけですが、
・入力ファイルの数値は半角スペースで区切られているようなので、
 fscanfで%lfと%lfの間に半角スペースを入れる必要があると思います。(出力も)

・出力するときは&を付ける必要はありません。

・%lfが\lfになってる箇所がある。

Re:ファイルからデータの読み込み

Posted: 2009年8月11日(火) 20:58
by non
fscanfはスペースで区切る必要はありません。
fprintfの方はスペースで区切らないとつながっちゃいます。

宣言で用意した型と、書式指定子が対応していないところがあります。
fprintfでは%lfではなく%fです。
指数表示で扱うなら、出力は%eにしないと有効数字が消えます。

>fscanf(in_file,"%lf%lf%d%lf%d%lf",&H,&K,&PN,&NH,&M1,&U0);
これに対応するfprintfは
fprintf(out_file,"%e %f %d %f %d %e\n",H,K,PN,NH,M1,U0);
です。

Re:ファイルからデータの読み込み

Posted: 2009年8月11日(火) 21:19
by pooka
>fscanfはスペースで区切る必要はありません。
そうですね。
提示されたプログラムを実行してみたら、
見たことないエラーがでたのでいろいろ修正していたら、
こんがらがったようです。
すみませんm(_ _)m

Re:ファイルからデータの読み込み

Posted: 2009年8月12日(水) 16:38
by Eda
non様、pooka様
回答して頂きありがとうございます。

おかげでなんとか自分の手に入れたい結果が入りそうです。