ページ 11

構造体を使ったファイルの入出力

Posted: 2011年1月25日(火) 16:25
by りさ
数値しか書かれていないデータがあります.
1 23.4 12.4
2 22.1 8.9
・・・・・・・

このデータを読み込み最高と最低を表示させるにはどうしたらいいでしょうか??

途中までやったのですがバグった感じになってしまいます.
このからどーしたらいいかもわかりません.

教えてください.

#include<stdio.h>
#include<stdlib.h>

main(int ac,char *av[]){
FILE *fp;
int n[10];
int a=0;
int i;
double low[10],high[10];
double low1;
double high1;

fp = fopen(av[1],"r");
if(fp == NULL){
printf("%sファイルが開けません\n",av[1]);
exit(1);
}
while((fscanf(fp,"%d,%lf,%lf",&(n[a]),&(low[a]),&(high[a]))) != EOF){
printf("最低気温: %lf 最高気温: %lf \n",low[a],high[a]);
a++;
}
fclose(fp);
}

Re: 構造体を使ったファイルの入出力

Posted: 2011年1月25日(火) 17:51
by さかまき
while((fscanf(fp,"%d %lf %lf",&(n[a]),&(low[a]),&(high[a]))) != EOF)
にかえればOK牧場。データの間のスペースが全角だったので、上のコードの
スペースも全角スペースです。もしデータのスペースが半角スペースだったら
上記コードのスペースも半角にしなきゃいけません

Re: 構造体を使ったファイルの入出力

Posted: 2011年1月25日(火) 17:51
by h2so5
「バグった感じ」がどのような状態なのか具体的に教えてください。

1 23.4 12.4
2 22.1 8.9

最高と最低を表示とは、例えば上のようなデータであれば、
最高:23.4   最低:1
という結果を出せばよいということですか?

Re: 構造体を使ったファイルの入出力

Posted: 2011年1月25日(火) 18:08
by さかまき
とりあえず知りたい事は
>このデータを読み込み最高と最低を表示させるにはどうしたらいいでしょうか??
ですよね?

>このからどーしたらいいかもわかりません.
このから、構造体を使ったファイルの入出力に発展させるんですよね?たぶん。
でも、このからどーしたらいいかもわからない事をどうしましょうと聞かれても
うまく答える事はできません。

Re: 構造体を使ったファイルの入出力

Posted: 2011年1月26日(水) 10:28
by りさ
バグった感じというのは、値が-34.4325433のようなあり得ない数値を表示してしまうことです。

1 23.4 12.4
2 22.1 8.9

最高 23.4   最低 1
となればいいです。

お願いします。

Re: 構造体を使ったファイルの入出力

Posted: 2011年1月26日(水) 10:31
by りさ
りさ さんが書きました:バグった感じというのは、値が-34.4325433のようなあり得ない数値を表示してしまうことです。

1 23.4 12.4
2 22.1 8.9

最高 23.4   最低 1
となればいいです。

なので条件文も入力しなければならないと思うのですが
どのようにつなげればいいのか教えてください。

お願いします。

Re: 構造体を使ったファイルの入出力

Posted: 2011年1月26日(水) 14:16
by さかまき
(あたえられた)仕様をはっきり理解されていないようです。
データは1行に、整数(たとえば日付) 実数(その日の最高気温) 実数(その日の最低気温)
で書かれています。最低、最大は気温であって、整数は対象ではないと思いますよ。

テーマから推測すると構造体を使わなくてはならない、とか
配列から推測すると最大件数は10件である、とかいろいろ
制限事項、仕様があるはずですが
本当に
>1 23.4 12.4
>2 22.1 8.9

>最高 23.4   最低 1
>となればいいです。

であればよいですか?だとすれば配列も不要で以下の様に書けます。

コード:

#include<stdio.h>
#include<stdlib.h>

main(int ac,char *av[]){
FILE *fp;
int		n;
double low;
double high;
double	minV=1.0E10 , maxV=-1.0E10;

	fp = fopen(av[1],"r");

	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",av[1]);
		exit(1);
	}

	while( fscanf(fp,"%d %lf %lf",&n,&low,&high) != EOF)
	{
		if (minV > n) minV= n;
		if (minV > low) minV= low;
		if (minV > high) minV= high;

		if (maxV < n) maxV= n;
		if (maxV < low) maxV= low;
		if (maxV < high) maxV= high;
	}
	printf("最低気温: %lf 最高気温: %lf \n",minV,maxV);
	fclose(fp);
}

Re: 構造体を使ったファイルの入出力

Posted: 2011年1月26日(水) 14:52
by りさ
何度もすいません.
さきほどの書き込みが間違っていました.

最低気温は 8.9 とならなければなりません.

Re: 構造体を使ったファイルの入出力

Posted: 2011年1月26日(水) 15:05
by さかまき
いろいろ言いましたが、他に問題なければ、以下で完成です。

コード:

#include<stdio.h>
#include<stdlib.h>

main(int ac,char *av[]){
FILE *fp;
int		n;
double low;
double high;
double	minV=1.0E10 , maxV=-1.0E10;

	fp = fopen(av[1],"r");

	if(fp == NULL)
	{
		printf("%sファイルが開けません\n",av[1]);
		exit(1);
	}

	while( fscanf(fp,"%d %lf %lf",&n,&low,&high) != EOF)
	{
		//if (minV > n) minV= n;
		if (minV > low) minV= low;
		if (minV > high) minV= high;

		//if (maxV < n) maxV= n;
		if (maxV < low) maxV= low;
		if (maxV < high) maxV= high;
	}
	printf("最高: %lf 最低: %lf \n",maxV,minV);
	fclose(fp);
}