2016-06-27 15 views
1

ich stat.st_mtime bin mit meiner letzten Änderung eines Verzeichnisses zu erhalten und es dann zu speichern, in eine file.txt (gespeicherte Zeichenfolge ist so etwas wie das: 1467035651)C++ Zeichenfolge konvertieren Time_t

Als ich später Daten abgerufen aus meiner file.txt, habe ich versucht, meine Zeichenfolge von meinem file.txt zu int Typ zu konvertieren, da die Zeichenfolge nur Sekunden enthält, aber ich weiß nicht, ob es eine gute Idee ist, das zu tun.

Gibt es eine Möglichkeit, direkt in time_t zu konvertieren?

+0

Lesen Sie einfach es zu einem time_t. – kfsone

+3

Wählen Sie bitte eine Sprache! –

+0

Für C++ ein Duplikat zu diesem: http://stackoverflow.com/q/7113396/694576 – alk

Antwort

7

Nach der reference documentationtime_t ist nur ein unspezifiziertes numerisches Format.

Lesen Sie einfach direkt den numerischen Wert aus der Datei zurück, gibt es keine Notwendigkeit für spezielle Umbauten ist:

time_t t; 
std::ifstream input("File.txt"); 
// ... 
input >> t; 
+2

Schöne C++ Antwort. C ist eine Herausforderung, da "time_t" vielleicht eine ganze Zahl oder FP ist. – chux

2

Die Funktion atoll in stdlib.h funktionieren sollte. Beispiel:

time_t t; 
char *time_string = //... 

t = (time_t) atoll(time_string); 
+0

Auf außergewöhnlichen Plattformen ist 'time_t' ein Gleitkomma. 'atoll (time_string)' kann signifikante Nachkommastellen abschneiden. – chux

+0

@chux: Es könnte sogar eine 'struct' sein: -O – alk

+0

Die' ato *() 'Funktionen sind fehleranfällig, da sie *** keine sichere Möglichkeit bieten, Fehler während der Konvertierung zu erkennen. – alk

2

[Unter der Annahme, C]

Die strto*() Familie von Funktionen bietet sichere Wege nicht, ein C- "String" in eine Ganzzahl umzuwandeln, oder signedunsigned, sowie float and double.

2

Gibt es eine Möglichkeit, direkt in time_t zu konvertieren?

Verschiedene andere Antworten haben direkte Lösungen mit Stärken und Schwächen gepostet.

enthält nur Sekunden, aber ich weiß nicht, ob es eine gute Idee ist, das zu tun.

Antwort hängt vom Ziel ab. IMO, ist es der falsche Ansatz

Anstatt speichern/lesen als einige Compiler abhängig Format, in Betracht ziehen, ISO 8601 Standards zu verwenden und den Zeitstempel in einer Textstandardversion zu speichern, die eindeutig die Zeitzone anzeigt, vorzuziehen universelle Zeit.

Beispiel C-Code als Beitrag ist markiert C.
Für schreiben, so etwas wie

// Minimum size to store a ISO 8601 date/time stamp 
//YYYY-MM-DDThh:mm:ss\0 
#define N (4 + 5*3 + 1 + 1) 

time_t x; 
struct tm *tm = gmtime(&x); 
if (tm == NULL) { 
    return failure; 
} 

char dest[N + 1]; 
int cnt = snprintf(dest, sizeof(dest), "%04d-%02d-%02dT%02d:%02d:%02dZ", 
    tm.tm_year + 1900, tm.tm_mon+1, tm.tm_mday, 
    tm.tm_hour, tm.tm_min, tm.tm_sec); 
if (cnt < 0 || cnt >= sizeof(dest)) { 
    return failure; 
} 

Zusätzliche Code Notwendigkeit für Sekundenbruchteile.
Siehe auch ftime(, , "%FT%T %z",).

Was würden Sie lieber in file.txt lesen?

1467035651 

oder

2016-06-27T13:54:11Z