ctime-Funktionen in C geben dieselbe Zeichenfolge für unterschiedliche Werte von atime, mtime und ctime zurück.
Bei Verwendung der stat()
Funktion in mingw-W64 und die Struktur es gibt, hier info
, warum ctime
die gleichen genaue Saiten für Rückkehr info.st_atime
, mtime
und ctime
, obwohl die ihre ganzzahlige Werte sind anders?
Wenn localtime
verwendet wird, um jede Zeitkomponente separat abzurufen, unterscheiden sich die Ergebnisse und erscheinen genau. Das heißt, sie stimmen mit den Daten in den von mir beobachteten Dateiordnern überein.
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
Eine ähnliche Frage wurde vor über drei Jahren ohne Antwort gestellt.
Weiß jemand warum und ob es in minGW-W64 eine Dokumentation zu Daten gibt oder nicht?
Vielen Dank.
Hier ist das vollständige Codebeispiel. Es ist ein hässliches Printf-Set.
#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;
}
Die Ergebnisse für eine Datei sehen wie folgt aus.
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
Beachten Sie, dass die Datenzeichenfolgen von ctime()
identisch sind, obwohl sich die ganzzahligen Werte für alle drei unterscheiden. Außerdem hat der ganzzahlige Wert für ctime
ein anderes Format als für atime
und mtime
. Das atime
und mtime
scheint Sekunden seit dem 1. Januar 1970 zu sein, aber ich weiß nicht, wie es ctime
ist 5767254
.
Vielen Dank.
Code gemäß Kommentar von @KamilCuk behoben. Meine Dummheit und mein hässlicher Druck waren die Ursache. Änderungen unten und neue Ergebnisse.
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 );
Neue Ergebnisse.
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
Antworten
Sie machen im Grunde:
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
}
Alle asctime
(vernünftigen Implementierungen) schreiben in denselben Speicher und geben denselben Zeiger zurück . Wenn printf
es ausgeführt wird, wird nur der Inhalt desselben Speichers gedruckt. Beachten Sie, dass die Reihenfolge der Auswertung von Argumenten für Funktionen nicht aufeinander folgt, die Reihenfolge der Auswertung von Funktionsaufrufen jedoch unbestimmt ist. Jedes der möglichen Ergebnisse von asctime
ist gültig. Verwenden asctime_r
oder rufen Sie nacheinander in separaten printf
s.