Эквивалент форматированного 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
, он думает, что может просто скопировать его как необработанный байт.