2012-02-12 3 views
2

Я хочу перегружатьПерегрузка ostream & operator <<: как заставить вывод нулей?

ostream& operator<<(ostream& out, const myType& y) 

для вывода больших целых чисел без знака, представленных в MyType вектором unsigned short. Так что если этот вектор имеет, скажем, элементы 1f, a356, 13d5, я хочу получить результат 1fa35613d5 - сейчас мне это нужно только для hex или oct. В частности, 1, 0, 0 должен быть выведен на 100000000. Я хочу добиться этого, последовательно выводя элементы вектора. Что я получаю с помощью этого метода, однако, 100, несмотря на то, что я установил

out.width(4); 
out.fill('0'); 
out << std::internal; 
out << std::noskipws; 

Конечно, я мог бы первым написать ushort в строку, а затем выход, но я бы предпочел, чтобы использовать только инструкции по форматированию для out приводят к тому, что это облегчает уважение настроек hex или oct от out. Какой вариант форматирования мне здесь не хватает?

+0

Построение собственной строки будет намного более эффективным (быстрее, используйте меньше памяти), чем использование шестнадцатеричного или восьмеричного формата для «ostream», что я бы пошел на дополнительную проблему проверки текущей базы а затем сделать свое собственное форматирование. –

ответ

2

следующая программа печатает с фиксированной шириной символов шестигранные:

#include <iostream> 
#include <iomanip> 
#include <vector> 

int main() 
{ 
    std::vector<unsigned short int> v { 10, 25, 0, 2000 }; 

    for (auto n : v) 
    { 
     std::cout << "0x" << std::hex << std::setfill('0') 
        << std::setw(4) << n << std::endl; 
    } 
} 

Выход:

0x000a 
0x0019 
0x0000 
0x07d0 

Если вы пишете функцию форматирования для этого вам не придется повторять std::hex, поскольку это постоянно. Сохранение состояния ostream немного сложнее, поэтому, возможно, вам стоит задуматься над тем, что такое экономия в Boost.

+0

Спасибо, это на самом деле не решило мою проблему, но дал мне подсказку, в которой я нуждался. I (ошибочно) предположил, что out.width (n) _permanently_ устанавливает ширину, но делает это только для одной операции вывода. – Thomas

Смежные вопросы