Эквивалент форматированного printf (c) для форматированного cerr в C++
Я хочу эквивалент printf("%2.2x", var); to cerr<< в C++.
код:
typedef unsigned char byte;
static byte var[10];
for(i=1; i<10; i++)
printf("%2.2x", var[i]);
идея состоит в том, чтобы перенаправить отладку в такой файл:./myprog 2>out.txt.
Если я не прошу слишком многого, я тоже хотел бы получить объяснения.
Спасибо!
4 ответов
Вы можете сделать это с помощью манипуляторов потока в C++, например:
#include <iostream>
#include <iomanip>
...
std::cerr << std::hex << std::setw(2) << std::setprecision(2) << (int)var[i];
Я думаю setw здесь правильно, но поиграйте, и еще несколько перечислены здесь:http://www.cplusplus.com/reference/iomanip/
другой способ-использовать boost::format:
std::cerr << boost::format("%2.2x") % static_cast<int>(var[i]);
#include <iostream>
#include <iomanip>
void show_a_byte(unsigned char val) {
std::ostream out(std::cerr.rdbuf());
out << std::hex << std::setw(2) << std::setprecision(2)
<< static_cast<unsigned int>(val);
}
я использовал временную ostream обмен cerrбуфер, чтобы убедиться, что ни один из манипуляторов не оставляет нежелательных побочных эффектов на cerr. The static_cast необходима потому, что когда ostream получает (signed или unsigned или обычный) char, он думает, что может просто скопировать его как необработанный байт.