[至急]構造体とファイル操作について
[至急]構造体とファイル操作について
構造体とファイル操作について質問します。
それぞれの月の気温を実行画面で入力してファイル(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]
それぞれの月の気温を実行画面で入力してファイル(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: [至急]構造体とファイル操作について
そうだと思ったら、使ってみたらどうでしょうか。aaa1458 さんが書きました: 下のソースコードを実行すると実行画面でそれぞれの月の気温を入力し、ファイルを見ると何も書かれていません。
それは一番したの//表示のところでfprintf(fp," ", );を使ってないからだと思います。
仮にここがコメントでなかったとしたら、コンパイルエラーが出るはずですね。
double型の変数に値を入れようとするときの書式文字列が"%d"というのはおかしいと思います。
気温?電話帳?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: [至急]構造体とファイル操作について
mainでファイルポインタの宣言をしてないのでエラーが出ます。そうだと思ったら、使ってみたらどうでしょうか。
どう対処すればいいのですか?
出ます。これは自分でもInfo x[] = fp;がどういう意味なのかよく分かりません。仮にここがコメントでなかったとしたら、コンパイルエラーが出るはずですね。
これはコメントアウトしたままでいいんですか?
ミスです。すみません。気温です。double型の変数に値を入れようとするときの書式文字列が"%d"というのはおかしいと思います。
気温?電話帳?
Re: [至急]構造体とファイル操作について
この2行は意味をなさないので不要です。そのかわりに、
引数で受け取ったx[]に基づき、構造体のメンバーであるところの
Xn
Xn_Ave
をfprintfしてやるとよいでしょう。
そもそも、
こうなってしまうのは、Init関数においてaaa1458 さんが書きました: 下のソースコードを実行すると実行画面でそれぞれの月の気温を入力し、ファイルを見ると何も書かれていません。
・test.txtを書き込み用にオープンする
・何も書き出さずにクローズしている
からです。
最後に編集したユーザー box on 2016年6月27日(月) 22:25 [ 編集 1 回目 ]
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: [至急]構造体とファイル操作について
「別の関数でファイル操作を宣言した」かどうかに関わらず、やりたい処理をするプログラムを書けばいいでしょう。aaa1458 さんが書きました:別の関数でファイル操作を宣言した場合、//表示のとこはどのように書けばいいのでしょうか。
読み出すのに書き込みモードで開いているのはおかしいでしょう。aaa1458 さんが書きました: //ファイルをオープン
fp = fopen("test.txt", "w");
(中略)
//ファイルの全てを読み出す
//Info x[] = fp;
特別な理由がなければ、標準でないvoid main(void)は使うべきではないでしょう。aaa1458 さんが書きました: void main(void)
hosted environmentでは、標準のmain関数はint main(void)またはint main(int argc, char* argv[]) (および等価なもの)です。
return文を使わずに戻った関数の返り値を使っているので、未定義動作です。aaa1458 さんが書きました: //ファイル
data_num = Init(data);
if (data_num == -1)
{
puts("電話帳.txtファイルの読み込みに失敗したため終了します");
return 0;
}
Init関数に適切にreturn文を追加してください。
普通に宣言と適切な初期化をすればいいでしょう。aaa1458 さんが書きました:mainでファイルポインタの宣言をしてないのでエラーが出ます。
どう対処すればいいのですか?
コメントアウトしたままでもいいですが、ゴミなので削除するといいでしょう。aaa1458 さんが書きました:これは自分でもInfo x[] = fp;がどういう意味なのかよく分かりません。
これはコメントアウトしたままでいいんですか?
コードを読む限り、気温でも電話帳でもなくtestではないでしょうか?aaa1458 さんが書きました:ミスです。すみません。気温です。double型の変数に値を入れようとするときの書式文字列が"%d"というのはおかしいと思います。
気温?電話帳?
[hr]
そもそもせっかくmain関数でデータを読み込んだのに、Init関数でファイルからデータを読み込もうとする意味がわかりません。
Init関数の名前を変えて書き込み操作をするようにするか、Init関数は消してmain関数でファイルへの書き込みをするといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: [至急]構造体とファイル操作について
これは//表示のところの をこの2行は意味をなさないので不要です。そのかわりに、
引数で受け取ったx[]に基づき、構造体のメンバーであるところの
Xn
Xn_Ave
をfprintfしてやるとよいでしょう。
printf("%d\t\t\t", i + 1);//「月」を表示
fprintf(fp,"%lf\t\t\t", data[i].Xn);//「月気温」を表示
fprintf(fp,"%lf\n", data[i].Xn_Ave);//「年間平均気温との差」を表示
下のコードのif分とfclose(fp)の間に何かをいれればいいのですか?こうなってしまうのは、Init関数において
・test.txtを書き込み用にオープンする
・何も書き出さずにクローズしている
からです
Re: [至急]構造体とファイル操作について
ん?みけCAT さんが書きました: そもそもせっかくmain関数でデータを読み込んだのに、Init関数でファイルからデータを読み込もうとする意味がわかりません。
mainでは標準入力から読んで構造体にセットし、Initに渡す。
Init(ちょっと名前が変な気がするけど)でその構造体をファイルに書き込みたい(ファイルのオープン、書き込み、クローズは全部ここでやっちゃう)
というのが元々の意図なのでは?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: [至急]構造体とファイル操作について
本当に申し訳ないのですが、このソースコードの誤りを訂正したうえでプログラムを作ってくれませんか?ん?
mainでは標準入力から読んで構造体にセットし、
Init(ちょっと名前が変な気がするけど)でその構造体をファイルに書き込みたい
というのが元々の意図なのでは?
それを見てしっかり勉強しますので、、、、
Re: [至急]構造体とファイル操作について
「月」も標準出力ではなくファイルに書き出したほうがいいのではないでしょうか?
いいえ、Init関数で書き込むなら、読み込みモードではダメです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: [至急]構造体とファイル操作について
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で殴ればいい!(死亡フラグ)
Re: [至急]構造体とファイル操作について
ありがとうございます。みけ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; }