2012-02-12 70 views
2

我想以重載重載ostream&operator <<:如何強制輸出零?

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

於由unsigned short一個向量中所表示的myType輸出大的無符號整數。所以,如果有問題的向量有,說,1f, a356, 13d5我想獲得輸出1fa35613d5的元素 - 現在我只需要這個爲hexoct輸出。 特別是,1, 0, 0應輸出到100000000。我想通過連續輸出矢量的元素來實現這一點。我做什麼用這種方法得到的,但是,是100,儘管事實上,我設置

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

當然,我可以先寫ushort爲一個字符串,然後輸出,但我寧願只使用格式化指令out因爲這使得更容易尊重或oct設置out。我在這裏錯過了哪些格式化選項?

+0

構建你自己的字符串將比使用十六進制或八進制格式爲'ostream'更有效率(更快,使用更少的內存),我會去檢查當前基地然後做我自己的格式。 – 2012-02-12 17:34:33

回答

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

謝謝,這並沒有真正解決我的問題,但給了我需要的提示。我(錯誤地)認爲out.width(n)_permanently_設置寬度,但它只對一個輸出操作這樣做。 – Thomas 2012-02-12 17:37:54