Эквивалент форматированного 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 ответов


использовать fprintf(stderr, ...), например:

fprintf(stderr, "%2.2x", var[i]);

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