1. 程式人生 > >C++ ostream 常用格式

C++ ostream 常用格式

注意一點: std::setw只對下一個輸出值有效,其他選項所有隨後的輸出都有效,比如:

case: std::cout << "[" << std::setw(6) << std::setfill('0') << "AAAA" << "BBBB" << "]";         // [00AAAABBBB] 可見"AAAA"被擴充套件成了6個字元寬度,而BBBB沒有被擴充套件;因為std::setw只對緊跟著的輸出有效, 即只對輸出"AAAA"有效,而對"BBBB"輸出無效。雖然std::setfill對輸出"BBBB"還是有效的, 但是因為長度限定, "BBBB"的輸出不需要padding也就看不出setfill起作用了,看下面case 2例子就明白。 case: std::cout << "[" << std::setw(6) << std::setfill('0') << "AAAA" << std::setw(6) << "BBBB" << "]"; // [00AAAA00BBBB] 可以看出setfill對所有的後續輸出都有效。 1. setw: 設定下一個輸出域的寬度 case: std::cout << "[" << std::setw(8) << "AAAA" << "]";        // [    AAAA] 設定域的輸出長度為6,而實際字串長度為4,所有前面補四個空格。 如果setw的數值小於實際資料長度,setw的值無效,比如上述例子: case: std::cout << "[" << std::setw(3) << "AAAA" << "]"         // [AAAA] 因為3小於實際字串長度4,最終輸出整個字串。 2. left/right/internal:在設定了輸出域的寬度setw後,如果設定對齊方式,左對齊還是右對齊 case: std::cout << "[" << std::setw(8) << std::left << "AAAA" << "]";       // [AAAA    ] case: std::cout << "[" << std::setw(8) << std::right << "AAAA" << "]";      // [    AAAA] case: std::cout << "[" << std::setw(8) << "AAAA" << "]";                    // [    AAAA] 預設是右對齊(std::right) 關於選項internal,在後面輸出數字的時候再討論;另外沒有居中對齊這個選項。 3. setfill:域寬度不夠時,還可以指定填充字元,用來代替預設的空格 case: std::cout << "[" << std::setw(8) << std::setfill('0') << "AAAA" << "]"; // [0000AAAA] 使用字元'0'作為填充 case: std::cout << "[" << std::setw(8) << std::setfill('0') << std::left << "AAAA" << "]";    // [AAAA0000] 4. showpos:輸出數字的正負號 case: std::cout << "[" << std::showpos << 123 << "]";   // [+123] case: std::cout << "[" << std::showpos << -456 << "]";  // [-456] case: std::cout << "[" << std::showpos << 0 << "]";     // [+0] 也可以指定數字域寬度setw case: std::cout << "[" << std::showpos << std::setw(8) << 123 << "]";    // [    +123] case: std::cout << "[" << std::showpos << std::setw(8) << -456 << "]";   // [    -456] case: std::cout << "[" << std::showpos << std::setw(8) << 0 << "]";      // [      +0] 設定fill case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << 123  << "]";    // [0000+123] case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << -456 << "]";    // [0000-456
] case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << 0    << "]";    // [000000+0] 這顯然不是我們想要的結果,此時對齊方式中的internal就有用處了。 internal的定義是在符號位和數值之間填充 case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << std::internal << 123  << "]";   // [+0000123
] case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << std::internal << -456 << "]";   // [-0000456] case: std::cout << "[" << std::showpos << std::setw(8) << std::setfill('0') << std::internal << 0    << "]";   // [+0000000
] 5. 輸出16進位制數字值 case: std::cout << "[" << std::hex << 5  << "]";    // [5] case: std::cout << "[" << std::hex << 10  << "]";   // [a] case: std::cout << "[" << std::hex << 20  << "]";   //  [14] 能不能把長度限定為兩個位元組 case: std::cout << "[" << std::hex << std::setw(2) << 5  << "]";    // [ 5] case: std::cout << "[" << std::hex << std::setw(2) << 10  << "]";   // [ a] case: std::cout << "[" << std::hex << std::setw(2) << 20  << "]";   // [14] 前面空格用0來代替就好了 case: std::cout << "[" << std::hex << std::setw(2) << std::setfill('0') << 5  << "]";   // [05] case: std::cout << "[" << std::hex << std::setw(2) << std::setfill('0') << 10  << "]";  // [0a] case: std::cout << "[" << std::hex << std::setw(2) << std::setfill('0') << 20  << "]";  // [14] 能不能加字首0x case: std::cout << "[" << std::showbase << std::hex << std::setw(2) << std::setfill('0') << 5  << "]";  // [0x5] case: std::cout << "[" << std::showbase << std::hex << std::setw(2) << std::setfill('0') << 10  << "]"; // [0xa] case: std::cout << "[" << std::showbase << std::hex << std::setw(2) << std::setfill('0') << 20  << "]"; // [0x14] 可是為什麼不能0x05, 0x0a, 0x14呢,因為setw(2)已經超出長度了,那如果設定setw(4)行不行啊 case: std::cout << "[" << std::showbase << std::hex << std::setw(4) << std::setfill('0') << 5  << "]";  // [00x5] case: std::cout << "[" << std::showbase << std::hex << std::setw(4) << std::setfill('0') << 10  << "]"; // [00xa] case: std::cout << "[" << std::showbase << std::hex << std::setw(4) << std::setfill('0') << 20  << "]"; // [0x14] 看來不行了,只能使用原始的笨辦法 std::cout << "[" << "0x" << std::hex << std::setw(2) << std::setfill('0') << 5  << "]";     // [0x05] std::cout << "[" << "0x" << std::hex << std::setw(2) << std::setfill('0') << 10  << "]";    // [0x0a] std::cout << "[" << "0x" << std::hex << std::setw(2) << std::setfill('0') << 20  << "]";    // [0x14] 能不能16進位制值(a-f)變大寫 std::cout << "[" << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << 5  << "]";   // [05] std::cout << "[" << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << 10  << "]";  // [0A] std::cout << "[" << std::hex << std::uppercase << std::setw(2) << std::setfill('0') << 20  << "]";  // [14]