2016-08-11 2 views
0
#include<iostream> 
#include<ctime> 
#include<string> 
using namespace std; 

int main() 
{ 
    string NowTime; 
    time_t now; 

    struct tm nowLocal; 

    now=time(NULL); // get the time from the OS 

    nowLocal=*localtime(&now); 

    NowTime = nowLocal.tm_hour + ':' + nowLocal.tm_min + ':' + nowLocal.tm_sec; 
    cout<< NowTime; 
} 

Wenn ich das Programm ausführen, zeigt es nichts, kann mir jemand helfen? Ich bin völlig neu in der Programmierung.Wie Systemzeit an eine String-Variable anhängen

+0

Werfen Sie einen Blick auf strftime, http://www.tutorialspoint.com/c_standard_library/c_function_strftime.htm –

Antwort

0

Die Linie:

NowTime = nowLocal.tm_hour + ':' + nowLocal.tm_min + ':' + nowLocal.tm_sec; 

fügt die Stunde, Minute und Sekunde in den numerischen Wert des Dickdarms Symbol, da char implizit in einen int dazu gezwungen wird. Dieser Wert wird dann im Zeichenfolgenzuweisungsoperator als Zeichen interpretiert.

Stattdessen können Sie die Werte einfach direkt an cout ausgeben. Sie werden von cout 's Stream Insertion Operator << entsprechend formatiert werden.

#include<iostream> 
#include<ctime> 
#include<string> 
using namespace std; 

int main() 
{ 
    string NowTime; 
    time_t now; 

    tm nowLocal; 

    now=time(NULL); // get the time from the OS 

    nowLocal=*localtime(&now); 

    cout << nowLocal.tm_hour << ':' << nowLocal.tm_min << ':' << nowLocal.tm_sec; 

    return 0; 
} 

Wenn Sie stattdessen wollen würde sie in einer Zeichenfolge speichern, lesen Sie über stringstreams auf. Sie haben eine ähnliche Syntax wie cout und können Formatierungszeichenfolgen erheblich vereinfachen.

0

Anstatt das Ergebnis in einer Variablen setzen zu müssen, könnten Sie Ausgabe, die es wie folgt aus:

cout << nowLocal.tm_hour << ':' << nowLocal.tm_min << ':' << nowLocal.tm_sec; 

Live Example

Auch, wenn Sie die Variable behalten möchten, dies tun:

NowTime = std::to_string(nowLocal.tm_hour) + ':' + std::to_string(nowLocal.tm_min) + ':' + std::to_string(nowLocal.tm_sec); 
cout << NowTime; 
0

Versuchen Sie folgendes:

#include<iostream> 
#include<ctime> 
#include<string> 
#include <sstream> 
using namespace std; 

int main() 
{ 
string NowTime; 
time_t now; 

struct tm nowLocal; 

now=time(NULL); // get the time from the OS 

nowLocal=*localtime(&now); 

stringstream s; 
s<<nowLocal.tm_hour; 
s<<":"; 
s<<nowLocal.tm_min; 
s<<":"; 
s<<nowLocal.tm_sec; 
NowTime = s.str(); 
cout<< NowTime; 
} 

Sie können nicht direkt von int zu String cas und Sie müssen Werte in stream und dann zu string.

1

Wenn Sie

cout << nowLocal.tm_hour + ':' + nowLocal.tm_min + ':' + nowLocal.tm_sec; 

versuchen werden Sie eine ganze Zahl sehen, nichts eine Zeit erinnert.
Dies ist, weil es die Summe von fünf ganzen Zahlen ist - die Zeichen werden zu ganzen Zahlen befördert, und dann wird alles zusammengerechnet.

Die einfachste Lösung ist, überhaupt nicht zu einer Zeichenfolge zu bauen, aber die Teile einzeln zu Ausgang:

cout << nowLocal.tm_hour << ':' << nowLocal.tm_min << ':' << nowLocal.tm_sec; 

Andernfalls müssen Sie diese Zahlen in Strings konvertieren:

NowTime = std::to_string(nowLocal.tm_hour) + ':' + std::to_string(nowLocal.tm_min) + ':' + std::to_string(nowLocal.tm_sec); 

oder, Sie kann eine std::ostringstream verwenden, die genau wie std::cout und andere Streams funktioniert, aber schreibt eine std::string:

std::ostringstream ss; 
ss << nowLocal.tm_hour << ':' << nowLocal.tm_min << ':' << nowLocal.tm_sec; 
NowTime = ss.str(); 
0

Wie wäre es mit iostringstream die gewünschte Zeichenfolge zu erstellen?

#include<iostream> 
#include<ctime> 
#include<string> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    ostringstream NowTime; 
    time_t now; 

    struct tm nowLocal; 

    now=time(NULL); // get the time from the OS 

    nowLocal=*localtime(&now); 

    NowTime << nowLocal.tm_hour << ":" << nowLocal.tm_min << ":" << nowLocal.tm_sec; 
    cout<< NowTime.str() << endl; 
} 

Oder für die Zwecke Ihres Programms könnten Sie einfach std :: cout verwenden, die auch ein Ausgabestrom ist.

cout << nowLocal.tm_hour << ":" << nowLocal.tm_min << ":" << nowLocal.tm_sec << endl; 
0

Da es sieht aus wie Sie Pre-C++ 11 sind und nicht std::to_string verwenden können. Hier ist eine C-ähnliche Vorgehensweise, bei der Sie sich an die derzeit verwendeten Includes halten.

#include<iostream> 
#include<ctime> 
#include<string> 

using namespace std; 

#define STR_LEN 128 

int main() 
{ 
    string nowTime; 

    time_t now; 

    struct tm nowLocal; 

    now = time(NULL); // get the time from the OS 

    nowLocal = *localtime(&now); 

    char hour[ STR_LEN ], min[ STR_LEN ], sec[ STR_LEN ]; 

    sprintf(hour, "%d", nowLocal.tm_hour); 

    sprintf(min, "%d", nowLocal.tm_min); 

    sprintf(sec, "%d", nowLocal.tm_sec); 

    nowTime = string(hour) + ':' + string(min) + ':' + string(sec); 

    cout << nowTime << endl; 
} 
0

Wie Systemzeit an eine Zeichenfolge anhängen?

Meine Antwort ist eine Komfortfunktion zu bauen.

Wenn Sie wirklich nur Stunde, Minute, Sekunde brauchen, dann brauchen Sie nicht die relativ langsame localtime(). (Auf der anderen Seite, wenn Sie mehr benötigen, sollten Sie localtime_r() für die Konvertierung bevorzugen).

Für ein eingebettetes System mehrere Verträge zurück, fand ich diese Konvertierung zu einer relativ langsamen Funktion und entschied, es zu vermeiden. Die Algorithmen zur Handhabung von Schalttagen, Jahrhunderten etc. erscheinen einfach genug. Ich vermute, dass ich es als langsam empfand, weil es mehr berechnet, als ich in der Anwendung benötigte, die versuchte, die Konvertierung viele Male pro Sekunde durchzuführen.

Es gibt einen einfacheren (und wahrscheinlich noch schnelleren) Ansatz, der modulare Arithmetik beinhaltet. Es beginnt gleich - mit einer Zeit (0) (und damit vermute ich, was ich hier mache ist in der localtime_r() Funktion 'versteckt'). Seitennotiz 1 - auf meinem älteren Dell, auf dem Ubuntu 15.10 läuft, ist time (0) einfach der schnellste Zugriff auf die Wanduhr, mit einer typischen Dauer von 6 oder 7 ns. Randnotiz 2 - time_t kann sich eines Tages ändern. "Der Wikipedia-Artikel in time_t beleuchtet dies. Unterm Strich ist der Typ von time_t in der C-Spezifikation nicht garantiert."

Der Code, den ich zur Zeit bequem einen Zeitstempel-String erzeugen verwenden:

std::string hhCmmCssGet(time_t tt = 0) // tt has default value 
{ 
    time_t now = (tt ? tt : time(0)); 

    static time_t  prev = 0; 
    static char hhmmss[] = "hh:mm:ss"; 

    if (prev != now) 
    { 
     prev = now; 

     const int32_t CST = -6; 
     int64_t hr = ((now/3600) % 24) + CST; // hr of day, CST offset 
     if (hr < 0) hr += 24; 
     uint64_t min = ((now/60) % 60); // min of day 
     uint64_t sec = (now % 60);   // sec of day 

     std::stringstream ss; 
     ss << std::dec 
     << std::setfill('0') << std::setw(2) << hr << ":" 
     << std::setfill('0') << std::setw(2) << min << ":" 
     << std::setfill('0') << std::setw(2) << sec; 

     for (size_t i=0; i<8; i++) // transfer new value 
     hhmmss[i] = ss.str()[i]; // into static hhmmss 
    } 
    std::string retVal(hhmmss); 
    return(retVal);   
} 

Die statischen Elemente und „if (! Prev = jetzt)“ -Klausel, diese Funktion tausende Male pro Sekunde aufgerufen ermöglichen werden ... mit viel reduziertem Aufwand. Die Sekunde aktualisiert schließlich nur 1ce pro Sekunde. Beachten Sie, dass std :: stringstream und modulare arithmetische Operationen nur 1 Sekunde pro Sekunde ausführen.

+0

So "string NowTime (hhCmmCssGet());" sollte für dich arbeiten. –

Verwandte Themen