fungsi ctime di C mengembalikan string yang sama untuk nilai atime, mtime, dan ctime yang berbeda?
Bila menggunakan stat()
fungsi dalam MinGW-W64, dan struct itu kembali, di sini info
, mengapa ctime
kembali string yang sama persis untuk info.st_atime
, mtime
dan ctime
, meskipun nilai integer mereka berbeda?
Jika localtime
digunakan untuk mendapatkan setiap komponen waktu secara terpisah, hasilnya berbeda dan tampak akurat; artinya, mereka cocok dengan tanggal di folder file yang saya amati.
ctime(&info.st_atime ) versus localtime(&info.st_atime )->tm_wday,
localtime(&info.st_atime )->tm_mon,
localtime(&info.st_atime )->tm_mday,
localtime(&info.st_atime )->tm_hour,
localtime(&info.st_atime )->tm_min,
localtime(&info.st_atime )->tm_sec,
localtime(&info.st_atime )->tm_year
Pertanyaan serupa diajukan lebih dari tiga tahun lalu tanpa jawaban.
Adakah yang tahu mengapa dan apakah ada dokumentasi tanggal di minGW-W64 atau tidak?
Terima kasih.
Berikut adalah contoh kode lengkapnya. Ini set printf jelek.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
#include <fcntl.h>
#include <time.h>
#include <errno.h>
int main (void)
{
DIR *dp;
struct dirent *ep;
struct stat info;
int rc;
char fl_name[300];
dp = opendir("./SQLite3");
if ( dp != NULL )
{
while ( ep = readdir( dp ) )
{
printf( "Name : %s, ", ep->d_name );
if ( *( ep->d_name ) == '.' )
{
printf(" non-useful file\n");
continue;
}
sprintf( fl_name, "%s%s", "./SQLite3/", ep->d_name );
if ( ( rc = stat( fl_name, &info ) ) != 0 )
{
printf( "rc : %d\n", rc );
printf( "errno : %d, strerror : %s\n", errno, strerror( errno ) );
break;
}
printf( "mode : %d, size : %d,\nst_atime : %slocal : %d %d %d %d : %d : %d %d,\ninteger value : %d\n"
"st_mtime : %slocal : %d %d %d %d : %d : %d %d,\ninteger value : %d\n"
"st_ctime : %slocal : %d %d %d %d : %d : %d %d,\ninteger value : %d\n\n",
info.st_mode, info.st_size,
ctime(&info.st_atime ),
localtime(&info.st_atime )->tm_wday,
localtime(&info.st_atime )->tm_mon,
localtime(&info.st_atime )->tm_mday,
localtime(&info.st_atime )->tm_hour,
localtime(&info.st_atime )->tm_min,
localtime(&info.st_atime )->tm_sec,
localtime(&info.st_atime )->tm_year,
info.st_atime,
ctime(&info.st_mtime ),
localtime(&info.st_mtime )->tm_wday,
localtime(&info.st_mtime )->tm_mon,
localtime(&info.st_mtime )->tm_mday,
localtime(&info.st_mtime )->tm_hour,
localtime(&info.st_mtime )->tm_min,
localtime(&info.st_mtime )->tm_sec,
localtime(&info.st_mtime )->tm_year,
info.st_mtime,
ctime(&info.st_ctime ),
localtime(&info.st_ctime )->tm_wday,
localtime(&info.st_ctime )->tm_mon,
localtime(&info.st_ctime )->tm_mday,
localtime(&info.st_ctime )->tm_hour,
localtime(&info.st_ctime )->tm_min,
localtime(&info.st_ctime )->tm_sec,
localtime(&info.st_ctime )->tm_year ),
info.st_ctime;
}
printf( "Now : %ld\n", time(NULL) );
printf( "Broke" );
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
return 0;
}
Hasil untuk satu file terlihat sebagai berikut.
Name : testing.c, mode : 33206, size : 21092,
st_atime : Thu Nov 26 23:56:20 2020
local : 4 10 26 23 : 56 : 20 120,
integer value : 1606452980
st_mtime : Thu Nov 26 23:56:20 2020
local : 5 10 27 0 : 16 : 58 120,
integer value : 1606454218
st_ctime : Thu Nov 26 23:56:20 2020
local : 6 9 31 23 : 8 : 28 120,
integer value : 5767254
Perhatikan bahwa string data dari ctime()
adalah identik meskipun nilai integer berbeda untuk ketiganya. Selain itu, nilai integer untuk ctime
adalah format yang berbeda dengan for atime
dan mtime
. The atime
dan mtime
tampak detik sejak Jan 1, 1970 tapi saya tidak tahu apa yang ctime
adalah sebagai 5767254
.
Terima kasih.
Kode tetap menurut komentar oleh @KamilCuk. Kebodohan dan cetakan jelek saya adalah penyebabnya. Perubahan di bawah dan hasil baru.
struct tm *local_tm_ptr;
local_tm_ptr = localtime(&info.st_atime );
printf( "mode : %d, size : %d,\nst_atime : %slocal : %d %d %d %d : %d : %d %d,\ninteger value : %ld\n",
info.st_mode, info.st_size,
ctime(&info.st_atime ),
local_tm_ptr->tm_wday,
local_tm_ptr->tm_mon,
local_tm_ptr->tm_mday,
local_tm_ptr->tm_hour,
local_tm_ptr->tm_min,
local_tm_ptr->tm_sec,
local_tm_ptr->tm_year,
info.st_atime );
local_tm_ptr = localtime(&info.st_mtime );
printf( "st_mtime : %slocal : %d %d %d %d : %d : %d %d,\ninteger value : %ld\n",
ctime(&info.st_mtime ),
local_tm_ptr->tm_wday,
local_tm_ptr->tm_mon,
local_tm_ptr->tm_mday,
local_tm_ptr->tm_hour,
local_tm_ptr->tm_min,
local_tm_ptr->tm_sec,
local_tm_ptr->tm_year,
info.st_mtime );
local_tm_ptr = localtime(&info.st_ctime );
printf( "st_ctime : %slocal : %d %d %d %d : %d : %d %d,\ninteger value : %ld\n\n",
ctime(&info.st_ctime ),
local_tm_ptr->tm_wday,
local_tm_ptr->tm_mon,
local_tm_ptr->tm_mday,
local_tm_ptr->tm_hour,
local_tm_ptr->tm_min,
local_tm_ptr->tm_sec,
local_tm_ptr->tm_year,
info.st_ctime );
Hasil baru.
Name : testing.c, mode : 33206, size : 21092,
st_atime : Thu Nov 26 23:56:20 2020
local : 4 10 26 23 : 56 : 20 120,
integer value : 1606452980
st_mtime : Fri Nov 27 00:16:58 2020
local : 5 10 27 0 : 16 : 58 120,
integer value : 1606454218
st_ctime : Sat Oct 31 23:08:28 2020
local : 6 9 31 23 : 8 : 28 120,
integer value : 1604200108
Jawaban
Anda pada dasarnya melakukan:
static char buffer[20]; // static buffer internal for asctime
char *my_asctime(int a) { // asctime
snprintf(buffer, 20, "%d", a); // asctime converts the input to some output
return buffer; // and returns pointer to internal buffer
}
int main() {
printf("%s %s %s %s\n",
my_asctime(1),
my_asctime(2),
my_asctime(3),
my_asctime(4)
);
// **Any** of the outputs are valid:
// 1 1 1 1
// 2 2 2 2
// 3 3 3 3
// 4 4 4 4
}
Semua asctime
(implementasi yang waras) menulis ke memori yang sama dan mengembalikan penunjuk yang sama . Jadi ketika printf
dijalankan itu hanya akan mencetak konten dari memori yang sama. Perhatikan bahwa urutan evaluasi argumen ke fungsi tidak diurutkan satu sama lain, tetapi urutan evaluasi panggilan fungsi diurutkan secara tidak pasti. Salah satu hasil yang mungkin dari asctime
akan valid. Gunakan asctime_r
atau panggil satu demi satu di printf
s terpisah .