ページ 1 / 1
[至急]構造体とファイル操作について
Posted: 2016年6月27日(月) 21:42
by aaa1458
構造体とファイル操作について質問します。
それぞれの月の気温を実行画面で入力してファイル(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]
Re: [至急]構造体とファイル操作について
Posted: 2016年6月27日(月) 21:54
by box
aaa1458 さんが書きました:
下のソースコードを実行すると実行画面でそれぞれの月の気温を入力し、ファイルを見ると何も書かれていません。
それは一番したの//表示のところでfprintf(fp," ", );を使ってないからだと思います。
そうだと思ったら、使ってみたらどうでしょうか。
aaa1458 さんが書きました:
コード:
//ファイルの全てを読み出す
//Info x[] = fp;
仮にここがコメントでなかったとしたら、コンパイルエラーが出るはずですね。
aaa1458 さんが書きました:
コード:
double Xn;//月気温
scanf("%d", &data[i].Xn);
double型の変数に値を入れようとするときの書式文字列が"%d"というのはおかしいと思います。
aaa1458 さんが書きました:
コード:
puts("電話帳.txtファイルの読み込みに失敗したため終了します");
気温?電話帳?
Re: [至急]構造体とファイル操作について
Posted: 2016年6月27日(月) 22:07
by aaa1458
そうだと思ったら、使ってみたらどうでしょうか。
mainでファイルポインタの宣言をしてないのでエラーが出ます。
どう対処すればいいのですか?
仮にここがコメントでなかったとしたら、コンパイルエラーが出るはずですね。
出ます。これは自分でもInfo x[] = fp;がどういう意味なのかよく分かりません。
これはコメントアウトしたままでいいんですか?
double型の変数に値を入れようとするときの書式文字列が"%d"というのはおかしいと思います。
気温?電話帳?
ミスです。すみません。気温です。
Re: [至急]構造体とファイル操作について
Posted: 2016年6月27日(月) 22:22
by box
aaa1458 さんが書きました:
コード:
//ファイルの全てを読み出す
//Info x[] = fp;
この2行は意味をなさないので不要です。そのかわりに、
引数で受け取ったx[]に基づき、構造体のメンバーであるところの
Xn
Xn_Ave
をfprintfしてやるとよいでしょう。
そもそも、
aaa1458 さんが書きました:
下のソースコードを実行すると実行画面でそれぞれの月の気温を入力し、ファイルを見ると何も書かれていません。
こうなってしまうのは、Init関数において
・test.txtを書き込み用にオープンする
・何も書き出さずにクローズしている
からです。
Re: [至急]構造体とファイル操作について
Posted: 2016年6月27日(月) 22:23
by みけCAT
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関数でファイルへの書き込みをするといいでしょう。
Re: [至急]構造体とファイル操作について
Posted: 2016年6月27日(月) 23:24
by aaa1458
この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;
}
Re: [至急]構造体とファイル操作について
Posted: 2016年6月27日(月) 23:34
by box
みけCAT さんが書きました:
そもそもせっかくmain関数でデータを読み込んだのに、Init関数でファイルからデータを読み込もうとする意味がわかりません。
ん?
mainでは標準入力から読んで構造体にセットし、Initに渡す。
Init(ちょっと名前が変な気がするけど)でその構造体をファイルに書き込みたい(ファイルのオープン、書き込み、クローズは全部ここでやっちゃう)
というのが元々の意図なのでは?
Re: [至急]構造体とファイル操作について
Posted: 2016年6月27日(月) 23:50
by aaa1458
ん?
mainでは標準入力から読んで構造体にセットし、
Init(ちょっと名前が変な気がするけど)でその構造体をファイルに書き込みたい
というのが元々の意図なのでは?
本当に申し訳ないのですが、このソースコードの誤りを訂正したうえでプログラムを作ってくれませんか?
それを見てしっかり勉強しますので、、、、
Re: [至急]構造体とファイル操作について
Posted: 2016年6月28日(火) 00:29
by みけCAT
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関数で書き込むなら、読み込みモードではダメです。
Re: [至急]構造体とファイル操作について
Posted: 2016年6月28日(火) 00:34
by みけ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;
}
Re: [至急]構造体とファイル操作について
Posted: 2016年6月28日(火) 00:42
by aaa1458
みけ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;
}
ありがとうございます。