2016-05-24 7 views
6

Я застрял на GCC4.8. Я хочу распечатать текущее время как нечто иное, чем секунды. Если put_time работал, мой код будет что-то простое, как это:Есть ли встроенная альтернатива std :: put_time для GCC <5?

std::cout << std::setw(24) << std::put_time(c_time, "[%T%z %F] "); 

Без put_time, я должен был бы доступ к элементам c_time вручную и делать все форматирование вручную, что бы боль в а ** и это то, что я гораздо лучше избегаю, если это возможно. Обратите внимание, что это не означает, что я никогда не хочу взаимодействовать с C каким-либо образом, даже косвенно - я просто хотел бы, если это возможно, избегать кодирования на C.

Однако я не могу найти альтернативы std::put_time, кроме strftime, чего я бы хотел избежать, потому что для этого требуется почти вдвое больше строк кода, и мне гораздо труднее читать, по крайней мере, для меня. Кроме того, это C++, а не C, поэтому я хотел бы избегать функций C, когда это возможно.

Я что-то упустил? Есть ли встроенная альтернатива std::put_time, которая работает под GCC 4.8?

Обратите внимание, что он не должен работать точно таким же образом - если он, скажем, напечатал его непосредственно на выходе, а не как манипулятор потока, это было бы прекрасно, как и функция который возвратил std::string, содержащий отформатированное время.

Я сделал хороший бит Googling и нашел <chrono>, но это не работает, потому что у него нет ничего, чтобы отформатировать время автоматически. Мне все равно придется делать это вручную, и я уверен, что это будет больше работы, так как мне придется анализировать количество секунд с эпохи в год, месяц, день и т. Д.

ответ

4

Там нет кроме put_time для outputing времени, предусмотренного в chronoiomanip или библиотеки функций.

Библиотека ctime предоставляет: strftime, ctime и asctime.

Поскольку http://stackoverflow.com не разрешают вопросы о нахождении 3 я сторонних библиотек, я собираюсь предположить, что вы просто просите кого-то, чтобы направить вас на использовании strftime? std::put_time(c_time, "[%T%z %F] ") может быть написана в следующем формате:

char foo[24]; 

if(0 < strftime(foo, sizeof(foo), "[%T%z %F] ", c_time)) cout << foo << endl; 
+0

Я спрашивал, есть ли какие-либо встроенные библиотеки для этого, что по теме. Вы ответили на это. Кроме того, Stack Overflow позволяет вам сказать: «Это библиотека, которая решает вашу проблему»; он просто запрашивает специально для отключенных ресурсов, которые запрещены. Другими словами, если вы знаете стороннюю библиотеку, вы можете упомянуть ее; это не то, о чем я просил. Спасибо за вашу помощь! –

4

Кроме того, это C++, а не C, поэтому я хотел бы избегать функций C, когда это возможно.

Это довольно глупое мышление. put_time использует std::strftime под капотом.

ext.manip#10

Возвращает: объект неопределенного типа ... где функция f определяется как:

template <class charT, class traits> 
void f(basic_ios<charT, traits>& str, const struct tm* tmb, const charT* fmt) { 
    /* ... */ 
    typedef time_put<charT, Iter> TimePut; 

    /* ... */ 
} 

и определение time_put «s в locale.time.put.virtuals#1:

Эффекты: Форматирует содержимое параметра t в символы, помещенные в выходную последовательность s. Форматирование управляется форматом и модификатором , интерпретируемым идентично формату спецификаторов в аргументе строки стандартной библиотечной функции strftime() ...