[至急]構造体とファイル操作について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
aaa1458

[至急]構造体とファイル操作について

#1

投稿記事 by aaa1458 » 9年前

構造体とファイル操作について質問します。

それぞれの月の気温を実行画面で入力してファイル(test.txt)に月、それぞれの月の気温、年間平均気温との差を表示させるプログラムを作っています。

下のソースコードを実行すると実行画面でそれぞれの月の気温を入力し、ファイルを見ると何も書かれていません。
それは一番したの//表示のところでfprintf(fp," ", );を使ってないからだと思います。
別の関数でファイル操作を宣言した場合、//表示のとこはどのように書けばいいのでしょうか。

説明へたですみません。

至急返信お願いします。

[ code]
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

#define SIZE 12

typedef struct
{
int n;//月
double Xn;//月気温
double Xn_Ave;//年間平均気温との差
}Info;

int Init(Info x[])
{
FILE *fp;

//ファイルをオープン
fp = fopen("test.txt", "w");

if (fp == NULL)
{
printf("ファイルをオープンできませんでした");
}

//ファイルの全てを読み出す
//Info x[] = fp;

//ファイルを閉じる
fclose(fp);
}

void main(void)
{
//変数宣言
Info data[SIZE];
int data_num = 0;

int i;
double sum = 0;
double ave = 0;

//入力処理
printf("各月の気温を入力してください\n");
for (i = 0; i < SIZE; i++)
{
printf("%d月:",i + 1);
scanf("%d", &data.Xn);

sum += data.Xn;
}
ave = sum / SIZE;

for (i = 0; i < SIZE; i++)
{
data.Xn_Ave = ave - data.Xn;
}

//ファイル
data_num = Init(data);
if (data_num == -1)
{
puts("電話帳.txtファイルの読み込みに失敗したため終了します");
return 0;
}

//表示
printf("月\t\t\t月気温\t\t\t年間平均気温との差\n");
for (i = 0; i > SIZE; i++)
{
printf("%d\t\t\t", i + 1);//「月」を表示
printf("%lf\t\t\t", data.Xn);//「月気温」を表示
printf("%lf\n", data.Xn_Ave);//「年間平均気温との差」を表示
}

}
[ /code]

box
記事: 2002
登録日時: 14年前

Re: [至急]構造体とファイル操作について

#2

投稿記事 by box » 9年前

aaa1458 さんが書きました: 下のソースコードを実行すると実行画面でそれぞれの月の気温を入力し、ファイルを見ると何も書かれていません。
それは一番したの//表示のところでfprintf(fp," ", );を使ってないからだと思います。
そうだと思ったら、使ってみたらどうでしょうか。
aaa1458 さんが書きました:

コード:

	//ファイルの全てを読み出す
	//Info x[] = fp;
仮にここがコメントでなかったとしたら、コンパイルエラーが出るはずですね。
aaa1458 さんが書きました:

コード:

	double Xn;//月気温
		scanf("%d", &data[i].Xn);
double型の変数に値を入れようとするときの書式文字列が"%d"というのはおかしいと思います。
aaa1458 さんが書きました:

コード:

		puts("電話帳.txtファイルの読み込みに失敗したため終了します");
 
気温?電話帳?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

aaa1458

Re: [至急]構造体とファイル操作について

#3

投稿記事 by aaa1458 » 9年前

そうだと思ったら、使ってみたらどうでしょうか。
mainでファイルポインタの宣言をしてないのでエラーが出ます。
どう対処すればいいのですか?
仮にここがコメントでなかったとしたら、コンパイルエラーが出るはずですね。
出ます。これは自分でもInfo x[] = fp;がどういう意味なのかよく分かりません。
これはコメントアウトしたままでいいんですか?
double型の変数に値を入れようとするときの書式文字列が"%d"というのはおかしいと思います。

気温?電話帳?
ミスです。すみません。気温です。

box
記事: 2002
登録日時: 14年前

Re: [至急]構造体とファイル操作について

#4

投稿記事 by box » 9年前

aaa1458 さんが書きました:

コード:

	//ファイルの全てを読み出す
	//Info x[] = fp;
この2行は意味をなさないので不要です。そのかわりに、
引数で受け取ったx[]に基づき、構造体のメンバーであるところの
Xn
Xn_Ave
をfprintfしてやるとよいでしょう。

そもそも、
aaa1458 さんが書きました: 下のソースコードを実行すると実行画面でそれぞれの月の気温を入力し、ファイルを見ると何も書かれていません。
こうなってしまうのは、Init関数において
 ・test.txtを書き込み用にオープンする
 ・何も書き出さずにクローズしている
からです。
最後に編集したユーザー box on 2016年6月27日(月) 22:25 [ 編集 1 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: [至急]構造体とファイル操作について

#5

投稿記事 by みけCAT » 9年前

aaa1458 さんが書きました:別の関数でファイル操作を宣言した場合、//表示のとこはどのように書けばいいのでしょうか。
「別の関数でファイル操作を宣言した」かどうかに関わらず、やりたい処理をするプログラムを書けばいいでしょう。
aaa1458 さんが書きました: //ファイルをオープン
fp = fopen("test.txt", "w");

(中略)

//ファイルの全てを読み出す
//Info x[] = fp;
読み出すのに書き込みモードで開いているのはおかしいでしょう。
aaa1458 さんが書きました: void main(void)
特別な理由がなければ、標準でないvoid main(void)は使うべきではないでしょう。
hosted environmentでは、標準のmain関数はint main(void)またはint main(int argc, char* argv[]) (および等価なもの)です。
aaa1458 さんが書きました: //ファイル
data_num = Init(data);
if (data_num == -1)
{
puts("電話帳.txtファイルの読み込みに失敗したため終了します");
return 0;
}
return文を使わずに戻った関数の返り値を使っているので、未定義動作です。
Init関数に適切にreturn文を追加してください。
aaa1458 さんが書きました:mainでファイルポインタの宣言をしてないのでエラーが出ます。
どう対処すればいいのですか?
普通に宣言と適切な初期化をすればいいでしょう。
aaa1458 さんが書きました:これは自分でもInfo x[] = fp;がどういう意味なのかよく分かりません。
これはコメントアウトしたままでいいんですか?
コメントアウトしたままでもいいですが、ゴミなので削除するといいでしょう。
aaa1458 さんが書きました:
double型の変数に値を入れようとするときの書式文字列が"%d"というのはおかしいと思います。

気温?電話帳?
ミスです。すみません。気温です。
コードを読む限り、気温でも電話帳でもなくtestではないでしょうか?

[hr]
そもそもせっかくmain関数でデータを読み込んだのに、Init関数でファイルからデータを読み込もうとする意味がわかりません。
Init関数の名前を変えて書き込み操作をするようにするか、Init関数は消してmain関数でファイルへの書き込みをするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa1458

Re: [至急]構造体とファイル操作について

#6

投稿記事 by aaa1458 » 9年前

この2行は意味をなさないので不要です。そのかわりに、
引数で受け取ったx[]に基づき、構造体のメンバーであるところの
Xn
Xn_Ave
をfprintfしてやるとよいでしょう。
これは//表示のところの

コード:

printf("%lf\t\t\t", data[i].Xn);//「月気温」を表示
	printf("%lf\n", data[i].Xn_Ave);//「年間平均気温との差」を表示

コード:

printf("%d\t\t\t", i + 1);//「月」を表示
		fprintf(fp,"%lf\t\t\t", data[i].Xn);//「月気温」を表示
		fprintf(fp,"%lf\n", data[i].Xn_Ave);//「年間平均気温との差」を表示
にしろってことですか?

こうなってしまうのは、Init関数において
 ・test.txtを書き込み用にオープンする
 ・何も書き出さずにクローズしている
からです
下のコードのif分とfclose(fp)の間に何かをいれればいいのですか?

コード:

int Init(Info x[])
{
	FILE *fp;

	fp = fopen("test.txt", "r");

	if (fp == NULL)
	{
		printf("ファイルをオープンできませんでした");
	}

	//ファイルを閉じる
	fclose(fp);

	return;
}

box
記事: 2002
登録日時: 14年前

Re: [至急]構造体とファイル操作について

#7

投稿記事 by box » 9年前

みけCAT さんが書きました: そもそもせっかくmain関数でデータを読み込んだのに、Init関数でファイルからデータを読み込もうとする意味がわかりません。
ん?
mainでは標準入力から読んで構造体にセットし、Initに渡す。
Init(ちょっと名前が変な気がするけど)でその構造体をファイルに書き込みたい(ファイルのオープン、書き込み、クローズは全部ここでやっちゃう)
というのが元々の意図なのでは?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

aaa1458

Re: [至急]構造体とファイル操作について

#8

投稿記事 by aaa1458 » 9年前

ん?
mainでは標準入力から読んで構造体にセットし、
Init(ちょっと名前が変な気がするけど)でその構造体をファイルに書き込みたい
というのが元々の意図なのでは?
本当に申し訳ないのですが、このソースコードの誤りを訂正したうえでプログラムを作ってくれませんか?
それを見てしっかり勉強しますので、、、、

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: [至急]構造体とファイル操作について

#9

投稿記事 by みけCAT » 9年前

aaa1458 さんが書きました:これは//表示のところの

コード:

printf("%lf\t\t\t", data[i].Xn);//「月気温」を表示
	printf("%lf\n", data[i].Xn_Ave);//「年間平均気温との差」を表示

コード:

printf("%d\t\t\t", i + 1);//「月」を表示
		fprintf(fp,"%lf\t\t\t", data[i].Xn);//「月気温」を表示
		fprintf(fp,"%lf\n", data[i].Xn_Ave);//「年間平均気温との差」を表示
にしろってことですか?
「月」も標準出力ではなくファイルに書き出したほうがいいのではないでしょうか?

aaa1458 さんが書きました:下のコードのif分とfclose(fp)の間に何かをいれればいいのですか?

コード:

int Init(Info x[])
{
	FILE *fp;

	fp = fopen("test.txt", "r");

	if (fp == NULL)
	{
		printf("ファイルをオープンできませんでした");
	}

	//ファイルを閉じる
	fclose(fp);

	return;
}
いいえ、Init関数で書き込むなら、読み込みモードではダメです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: [至急]構造体とファイル操作について

#10

投稿記事 by みけCAT » 9年前

aaa1458 さんが書きました:本当に申し訳ないのですが、このソースコードの誤りを訂正したうえでプログラムを作ってくれませんか?

コード:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

#define SIZE 12

typedef struct
{
	int n;//月
	double Xn;//月気温
	double Xn_Ave;//年間平均気温との差
}Info;

int WriteToFile(const Info x[])
{
	FILE *fp;
	int i;

	//ファイルをオープン
	fp = fopen("test.txt", "w");

	if (fp == NULL)
	{
		puts("ファイルをオープンできませんでした");
		return -1;
	}

	//ファイルに全てを書き出す
	
	//表示
	fprintf(fp, "月\t\t\t月気温\t\t\t年間平均気温との差\n");
	for (i = 0; i < SIZE; i++)
	{
		fprintf(fp, "%d\t\t\t", i + 1);//「月」を表示
		fprintf(fp, "%lf\t\t\t", x[i].Xn);//「月気温」を表示
		fprintf(fp, "%lf\n", x[i].Xn_Ave);//「年間平均気温との差」を表示
	}

	//ファイルを閉じる
	fclose(fp);
	return 0;
}

int main(void)
{
	//変数宣言
	Info data[SIZE];
	int data_num = 0;

	int i;
	double sum = 0;
	double ave = 0;

	//入力処理
	printf("各月の気温を入力してください\n");
	for (i = 0; i < SIZE; i++)
	{
		printf("%d月:",i + 1);
		if (scanf("%lf", &data[i].Xn) != 1)
		{
			puts("入力エラーです");
			return 1;
		}

		sum += data[i].Xn;
	}
	ave = sum / SIZE;

	for (i = 0; i < SIZE; i++)
	{
		data[i].Xn_Ave = ave - data[i].Xn;
	}

	//ファイル
	data_num = WriteToFile(data);
	if (data_num == -1)
	{
		puts("test.txtファイルの書き込みに失敗したため終了します");
		return 1;
	}

	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

aaa1458

Re: [至急]構造体とファイル操作について

#11

投稿記事 by aaa1458 » 9年前

みけCAT さんが書きました:
aaa1458 さんが書きました:本当に申し訳ないのですが、このソースコードの誤りを訂正したうえでプログラムを作ってくれませんか?

コード:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

#define SIZE 12

typedef struct
{
	int n;//月
	double Xn;//月気温
	double Xn_Ave;//年間平均気温との差
}Info;

int WriteToFile(const Info x[])
{
	FILE *fp;
	int i;

	//ファイルをオープン
	fp = fopen("test.txt", "w");

	if (fp == NULL)
	{
		puts("ファイルをオープンできませんでした");
		return -1;
	}

	//ファイルに全てを書き出す
	
	//表示
	fprintf(fp, "月\t\t\t月気温\t\t\t年間平均気温との差\n");
	for (i = 0; i < SIZE; i++)
	{
		fprintf(fp, "%d\t\t\t", i + 1);//「月」を表示
		fprintf(fp, "%lf\t\t\t", x[i].Xn);//「月気温」を表示
		fprintf(fp, "%lf\n", x[i].Xn_Ave);//「年間平均気温との差」を表示
	}

	//ファイルを閉じる
	fclose(fp);
	return 0;
}

int main(void)
{
	//変数宣言
	Info data[SIZE];
	int data_num = 0;

	int i;
	double sum = 0;
	double ave = 0;

	//入力処理
	printf("各月の気温を入力してください\n");
	for (i = 0; i < SIZE; i++)
	{
		printf("%d月:",i + 1);
		if (scanf("%lf", &data[i].Xn) != 1)
		{
			puts("入力エラーです");
			return 1;
		}

		sum += data[i].Xn;
	}
	ave = sum / SIZE;

	for (i = 0; i < SIZE; i++)
	{
		data[i].Xn_Ave = ave - data[i].Xn;
	}

	//ファイル
	data_num = WriteToFile(data);
	if (data_num == -1)
	{
		puts("test.txtファイルの書き込みに失敗したため終了します");
		return 1;
	}

	return 0;
}
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る