web-dev-qa-db-ja.com

GCC <5のstd :: put_timeに代わる組み込みの代替手段はありますか?

とりあえずGCC4.8にこだわっています。現在の時刻を秒以外で印刷したい。 put_timeが機能した場合、私のコードは次のような単純なものになります。

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

put_timeがないと、c_timeの要素に手動でアクセスし、すべてのフォーマットを手動で行う必要があります。これはa **の苦痛であり、可能であれば避けたいものです。これはではないことに注意してくださいは、間接的であっても、Cと対話したくないことを意味します-可能であれば、Cで直接コーディングすることは避けたいと思います。

ただし、strftimeを除いて、std::put_timeに代わるものは見つかりません。これは、コードのほぼ2行が必要であり、少なくとも私にとっては非常に読みにくいため、避けたいと思います。また、これはCではなくC++なので、可能な限りC関数を避けたいと思います。

私は何かが足りないのですか? GCC 4.8で動作するstd::put_timeの組み込みの代替手段はありますか?

まったく同じように機能する必要はないことに注意してください。たとえば、ストリームマニピュレータではなく、出力に直接出力する場合は、std::stringを返す関数と同様に、まったく問題ありません。フォーマットされた時間を含みます。

グーグルをかなり行って、 <chrono> を見つけましたが、時間を自動的にフォーマットするものがないため、機能しません。私はまだ手動でそれをしなければならないでしょう、そして私はエポックからの秒数を解析しなければならないので、それはもっと働くだろうとかなり確信しています年、月、日など。

13

chrono または iomanip で提供される時間の出力には、 put_time 以外の関数はありません。図書館。

ctimeライブラリは以下を提供します: strftimectime 、および asctime

http://stackoverflow.com は、3を見つけることについての質問を許可しないためrd パーティーライブラリ、私はあなたが誰かに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;
10
Jonathan Mee

また、これはCではなくC++なので、可能な限りC関数を避けたいと思います。

それはかなりばかげた考え方です。 _put_time_は、内部で_std::strftime_を使用します。

ext.manip#1

戻り値:指定されていないタイプのオブジェクト...ここで、関数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_の定義は locale.time.put.virtuals#1 にあります:

効果:パラメータtの内容を出力シーケンスsに配置された文字にフォーマットします。フォーマットは、パラメータformatと修飾子によって制御され、標準ライブラリ関数strftime() ..の文字列引数のフォーマット指定子と同じように解釈されます。