2016-08-11 5 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; 
} 

Когда я запускаю программу, она ничего не отображает, может кто-нибудь мне помочь? Я совершенно новый в программировании.Как добавить системное время к строковой переменной

+0

Посмотрите на strftime, http://www.tutorialspoint.com/c_standard_library/c_function_strftime.htm –

ответ

0

Линия:

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

добавляет час, минуту, а вторая к числовому значению символа толстой кишки, так как символ неявно принуждают к междунар. Это значение затем интерпретируется как символ в операторе присваивания строк.

Вместо этого вы можете просто вывести значения непосредственно на cout. Они будут отформатированы соответствующим образом оператором вставки потока cout<<.

#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; 
} 

Если бы вместо этого хотите, чтобы хранить их в строку, прочитать о stringstreams. Они имеют аналогичный синтаксис cout и могут значительно упростить форматирование строк.

0

Вместо того, чтобы поместить результат в переменную, вы можете выводить это следующим образом:

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

Live Example

Кроме того, если вы хотите сохранить переменную, сделайте следующее:

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

Попробуйте это:

#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; 
} 

Вы не можете напрямую передавать данные из int в строку, и вам нужно поместить значения в поток, а затем в строку.

1

Если вы пытаетесь

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

вы увидите целое, а не что-то похожее на время.
Это потому, что это сумма из пяти целых чисел - символы продвигаются до целых чисел, а затем все складывается.

Самое простое исправление не строить строку на всех, но для вывода частей по отдельности:

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

В противном случае, вам нужно преобразовать эти числа в строки:

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

или вы можно использовать std::ostringstream, который работает так же, как std::cout и другие потоки, но записывает на std::string:

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

Как насчет использования iostringstream для создания нужной строки?

#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; 
} 

Или для целей вашей программы вы могли бы просто использовать станд :: соиЬ который также случается выходной поток.

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

Так это выглядит, как вы предварительно C++ 11 и не может использовать std::to_string. Вот C-образный способ сделать это, придерживаясь тех включений, которые вы сейчас используете.

#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

Как добавить системное время к строке?

Мой ответ - построить функцию удобства.

Если вам действительно нужен только час, минута, секунда, вам не нужно использовать относительно медленное местное время(). (с другой стороны, если вам нужно больше, я думаю, вы должны предпочесть localtime_r() для преобразования).

Для встроенной системы несколько контрактов назад, я нашел, что это преобразование является относительно медленной функцией и выбрало его. Алгоритмы обработки прыжков, веков и т. Д. Кажутся достаточно простыми. Я подозреваю, что считаю это медленным, потому что он вычисляет больше, чем мне нужно в этом приложении, которое пыталось выполнить преобразование много раз в секунду.

Существует более простой (и, вероятно, еще более быстрый) подход с использованием модульной арифметики. Он начинается тем же самым - со временем (0) (и, следовательно, я подозреваю, что то, что я здесь делаю, «скрыто» в функции localtime_r()). Сторона примечания 1 - на моей старой Dell, работающей под управлением Ubuntu 15.10, время (0) - это самый быстрый доступ к настенным часам, измеряющий около 6 или 7 нс «типичной» продолжительности. Сторона примечания 2 - time_t может измениться когда-нибудь. «Статья статьи Time_t Wikipedia проливает свет на это. Суть в том, что тип time_t не гарантируется в спецификации C».

Код настоящее время я использую, чтобы удобно генерировать штамп времени строку:

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);   
} 

Статичные элементы и «если (! Пред = сейчас)» положение, позволяют эту функцию, которая будет вызвана тысячи раз в секунду ... с гораздо меньшими усилиями. Второй, в конце концов, только обновления 1ce в секунду. И обратите внимание, что данные std :: stringstream и модульные арифметические операции выполняются только 1 раз в секунду.

+0

Таким образом, «строка NowTime (hhCmmCssGet());» должен работать на вас. –

 Смежные вопросы

  • Нет связанных вопросов^_^