我想用'0'
作为填充字符在2个字段上打印一堆整数。我可以做到,但这会导致代码重复。我应该如何更改代码,以便可以排除重复的代码?
#include <ctime>
#include <sstream>
#include <iomanip>
#include <iostream>
using namespace std;
string timestamp() {
time_t now = time(0);
tm t = *localtime(&now);
ostringstream ss;
t.tm_mday = 9; // cheat a little to test it
t.tm_hour = 8;
ss << (t.tm_year+1900)
<< setw(2) << setfill('0') << (t.tm_mon+1) // Code duplication
<< setw(2) << setfill('0') << t.tm_mday
<< setw(2) << setfill('0') << t.tm_hour
<< setw(2) << setfill('0') << t.tm_min
<< setw(2) << setfill('0') << t.tm_sec;
return ss.str();
}
int main() {
cout << timestamp() << endl;
return 0;
}
我努力了
std::ostream& operator<<(std::ostream& s, int i) {
return s << std::setw(2) << std::setfill('0') << i;
}
但它不起作用,
operator<<
调用不明确。编辑我得到了4个很棒的答案,我选择了一个也许是最简单,最通用的答案(也就是说,不假定我们正在处理时间戳)。对于实际问题,我可能会使用
std::put_time
或 strftime
。 最佳答案
您需要像这样的字符串流代理:
struct stream{
std::ostringstream ss;
stream& operator<<(int i){
ss << std::setw(2) << std::setfill('0') << i;
return *this; // See Note below
}
} ss;
那么您的格式代码就是这样:
ss << (t.tm_year+1900)
<< (t.tm_mon+1)
<< t.tm_mday
<< t.tm_hour
<< t.tm_min
<< t.tm_sec;
return ss.ss.str();
ps。请注意我的stream::operator <