プロが教えるわが家の防犯対策術!

いつもお世話になっています。
以下のソースはファイルに今日の日付を書き込み、それをコマンドプロンプトに表示させたいと思い作成しましたが、できません。
どうか教えてください。
#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;
}

A 回答 (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/localtim …→『localtime』
 http://www9.plala.or.jp/sgwr-t/lib/localtime.html→『localtime』
 を参考にして下さい。
・以上。
    • good
    • 0
この回答へのお礼

いつもありがとうございます。
すごく丁寧に回答していただきありがとうございます。
理解できました。
ありがとうございます。

お礼日時:2007/09/13 22:39

>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);
でファイルを作成しているので、テキストファイルを作ろうとしているのは理解していると思いますが、テキストファイルなのでテキストエディタで読み込めばファイルがちゃんと出来ているのは確認できます。
ワザワザプログラムで読み込まなくても良いんですが、今の技術レベルだと読み込みプログラムを書くことも難しそうですから、挑戦してみたほうが良いでしょうね。

で、前回の構造体をファイルに書きたいには直接つながっていかないですが狙い通りなんでしょうか?
構造体をファイルに書き出すなら、バイナリファイルを扱わなくてはいけません。
テキストファイルとバイナリファイルの違いが分からないから、まずテキストファイルを学ぼうとする意図なら良いんですけど。
    • good
    • 0
この回答へのお礼

いつもありがとうございます。
先ほどみなさんからの回答をみて、自分が質問した内容がおかしいことに気づきました。
以後気をつけて質問します。
ありがとうございます。

お礼日時:2007/09/13 22:43

> Cの場合、ブロックの途中で変数を定義できません。



C99はOKのようですよ(笑)
    • good
    • 0
この回答へのお礼

回答有難うございます。
またよろしくお願いします。

お礼日時:2007/09/13 22:45

> int year, month, day;



Cの場合、ブロックの途中で変数を定義できません。
C++はできます。
    • good
    • 0
この回答へのお礼

回答していただき有難うございます。
以後気をつけます。

お礼日時:2007/09/13 22:47

以下のように、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;
}
    • good
    • 0

>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の間違いでは?
    • good
    • 0
この回答へのお礼

回答していただき有難うございます。
訂正いたしました。
またよろしくお願いします。

お礼日時:2007/09/13 22:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!