localtime_sを使い時間取得をした後、取得時間をファイルに書き出すプログラム
include<stdio.h>
include<time.h>
int main(void)
{
FILE *fp;
time_t jikan = time(NULL);
struct tm imanojikan;
errno_t error;
error = localtime_s(&imanojikan, &jikan);
if (fopen_s(&fp, "jikanget.dat", "w") != 0) {
printf("ファイルをオープンできません。\n");
if (error != 0) {
printf("現在の日付・時刻を書き出すことができません。\n");
}
}
else {
printf("現在の日付・時刻を書き出しました。\n");
fprintf(fp,"%d %d %d %d %d %d\n",imanojikan.tm_year+1900,imanojikan.tm_mon+1,imanojikan.tm_mday,
imanojikan.tm_hour, imanojikan.tm_min, imanojikan.tm_sec);
fclose(fp);
}
}
実行環境
VisualStudio2017 Communityを使用しました。
localtimeとlocaltime_sの違い
Visual Studioでlocaltimeを使うと、警告が出てきてしまいます(上のコードでもしれっとfopenじゃなくてfopen_sを使っているように、localtimeのほかにもあります)。では、localtimeを使用したため出た警告をどうやって消すかというと、警告に従ってlocaltime_sを使うのが一つの手としてありますが(マクロ使って警告が出ないようにし、localtimeを使用しコンパイルを通すやり方もあります)そうなるとlocaltimeとlocaltime_sの違いが出てきて私のような初心者には困ることになります。そこで、初心者なりに調べて出した二つの基本的な違いは以下の通りとなリます。
localtime
localtimeはその返り値として要素別の時間をtm構造体へのポインタに返してくれます。引数は一つだけでtime_t型の変数(time関数で取得した暦時刻が入っているもの)です。
localtime_s
localtime_sはlocaltimeと違いerrno_t型(エラーを判別するために作られた型)の値を返します。引数は二つあり、第一引数にはlocaltime_sで取得した値を入れておくためのtm構造体の変数のアドレス(localtimeと違い、tm構造体へのポインタでないことに注意)であり、第二引数にはlocaltimeの時と同じようにtime_t型の変数(time関数で取得した暦時刻が入っているもの)をとります。ちなみにerror_t型の変数errorで得られた値についてはここでは使わない(使い道がわからないのは内緒)ので無視しています。
結論
つまり、localtimeとlocaltime_sの違いとは暦時刻を処理した値を渡す箇所が**、localtimeだと返し値**、localtime_sだと第一引数というのがlocaltimeとlocaltime_sの主な違いといえます。