- ベストアンサー
C言語 初心者です。
いつもお世話になっています。 以下のソースはファイルに今日の日付を書き込み、それをコマンドプロンプトに表示させたいと思い作成しましたが、できません。 どうか教えてください。 #include <time.h> #include <stdio.h> void put_data(void) { FILE *fp; time_t t; struct tm *local; time(&t); local = localtime(&t); fp = fopen("time.txt", "w"); int year, month, day; fprintf(fp, "%d%d%d%d\t",local->tm_year + 1900, local->tm_mon + 1, local->tm_day); printf("%d%d%d%d\n", year, month, day); fclose(fp); } int main(void) { put_data(); return 0; }
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・次に日付の取得、書き込み、表示と分けてサンプルを載せておきます。 サンプル1…取得 サンプル2…書き込み サンプル3…表示 サンプル1: time_t t = time(NULL); struct tm local = localtime(&t); サンプル2: FILE *fp; if ( (fp = fopen("time.txt","w")) != NULL ){ int year = local->tm_year + 1900; int month = local->tm_mon + 1; int day = local->tm_mday fprintf( fp, "%04d-%02d-%02d\n", year, month, day ); fclose( fp ); } サンプル3: int year = local->tm_year + 1900; ←サンプル2と同じ int month = local->tm_mon + 1; int day = local->tm_mday printf( "%04d-%02d-%02d\n", year, month, day ); ←fprintf() とほぼ同じ おまけ: struct tm { int tm_sec; /* 秒 [0-61] 最大2秒までのうるう秒を考慮 */ int tm_min; /* 分 [0-59] */ int tm_hour; /* 時 [0-23] */ int tm_mday; /* 日 [1-31] */ int tm_mon; /* 月 [0-11] 0から始まることに注意 */ int tm_year; /* 年 [1900からの経過年数] */ int tm_wday; /* 曜日 [0:日 1:月 ... 6:土] */ int tm_yday; /* 年内の通し日数 [0-365] 0から始まることに注意*/ int tm_isdst; /* 夏時間が無効であれば 0 */ }; まとめ: ・上記のサンプル1~サンプル3をまとめて1つにすると次のようになります。 #include <time.h> #include <stdio.h> int main( void ) { time_t t = time(NULL); struct tm local = localtime(&t); FILE *fp; if ( (fp = fopen("time.txt","w")) != NULL ){ int year = local->tm_year + 1900; int month = local->tm_mon + 1; int day = local->tm_mday fprintf( fp, "%04d-%02d-%02d\n", year, month, day ); printf( "%04d-%02d-%02d\n", year, month, day ); fclose( fp ); } return 0; } ・参考文献として http://www.bohyoh.com/CandCPP/C/Library/time.html→『time』 http://www.bohyoh.com/CandCPP/C/Library/localtime.html→『localtime』 http://www9.plala.or.jp/sgwr-t/lib/localtime.html→『localtime』 を参考にして下さい。 ・以上。
その他の回答 (5)
- zwi
- ベストアンサー率56% (730/1282)
>printf("%d%d%d%d\n", year, month, day); このprintfは、前の質問の意図からすると本当はファイルの中身を確認したいんじゃないでしょうか? ファイルの中身を確認したい場合、fclose後に再度READオープンして読み込まないと意図通りにはなりません。 今回の場合、 >fprintf(fp, "%d%d%d%d\t",local->tm_year + 1900, local->tm_mon + 1, local->tm_day); でファイルを作成しているので、テキストファイルを作ろうとしているのは理解していると思いますが、テキストファイルなのでテキストエディタで読み込めばファイルがちゃんと出来ているのは確認できます。 ワザワザプログラムで読み込まなくても良いんですが、今の技術レベルだと読み込みプログラムを書くことも難しそうですから、挑戦してみたほうが良いでしょうね。 で、前回の構造体をファイルに書きたいには直接つながっていかないですが狙い通りなんでしょうか? 構造体をファイルに書き出すなら、バイナリファイルを扱わなくてはいけません。 テキストファイルとバイナリファイルの違いが分からないから、まずテキストファイルを学ぼうとする意図なら良いんですけど。
お礼
いつもありがとうございます。 先ほどみなさんからの回答をみて、自分が質問した内容がおかしいことに気づきました。 以後気をつけて質問します。 ありがとうございます。
- mikaemi
- ベストアンサー率50% (33/65)
> Cの場合、ブロックの途中で変数を定義できません。 C99はOKのようですよ(笑)
お礼
回答有難うございます。 またよろしくお願いします。
- asuncion
- ベストアンサー率33% (2127/6289)
> int year, month, day; Cの場合、ブロックの途中で変数を定義できません。 C++はできます。
お礼
回答していただき有難うございます。 以後気をつけます。
- mikaemi
- ベストアンサー率50% (33/65)
以下のように、asctime() とかの引数として渡したいだけなどの場合 time_t t; time(&t); printf("%s", asctime(localtime(&t))); は別にして、localtime() や gmtime() などの内部の静的な領域へのポインタを返すものの戻り値を、ポインタのまま使いまわすより、自分用の領域にコピーして使ったほうが紛れがなくていいんじゃないでしょうか?^^ ===== #include <time.h> #include <stdio.h> void put_data(void) { FILE *fp; time_t t; struct tm local; time(&t); local = *localtime(&t); if ((fp = fopen("time.txt", "w")) != NULL) { int year = local.tm_year + 1900, month = local.tm_mon + 1, day = local.tm_mday; fprintf(fp, "%d%d%d\t", year, month, day); printf("%d%d%d\n", year, month, day); fclose(fp); } } int main(void) { put_data(); return 0; }
- dease
- ベストアンサー率0% (0/7)
>fprintf(fp, "%d%d%d%d\t",local->tm_year + 1900,local->tm_mon + 1, local->tm_day); >printf("%d%d%d%d\n", year, month, day); まず%dがfprintfとprintfのそれぞれに一個ずつ多いです。 それと、year、month、dayは宣言しただけで、自分の望む値が入ってないまま表示しようとしてるから、ちゃんと代入してから使うか、printf("%d%d%d\n", local->tm_year+1900, local->tm_mon+1, local->tm_mday);みたいにする。 あと、tm_dayじゃなくtm_mdayの間違いでは?
お礼
回答していただき有難うございます。 訂正いたしました。 またよろしくお願いします。
お礼
いつもありがとうございます。 すごく丁寧に回答していただきありがとうございます。 理解できました。 ありがとうございます。