std::fstream::open 的 mode 參數常見寫法:std::ios::in | std::ios::out | std::ios::binary。為何用位元或 |?因為每個模式旗標佔用不同的位元位置,組合時需保留各自的位元,而非數值相加。
std::ios::in = 0b001 (1)std::ios::out = 0b010 (2)std::ios::binary = 0b100 (4)位元或:001 | 010 | 100 = 111 (7),三個旗標全開。
數值相加:1 + 2 + 4 = 7,此例結果相同,但若旗標位元重疊 (如自定義旗標 3 = 0b011) 則相加會產生進位錯誤 (0b001 + 0b010 + 0b011 = 0b100 = 4),導致旗標遺失。
& 用於 檢測 某旗標是否存在:(mode & std::ios::in) != 0。組合旗標必須用 |,檢測用 &,兩者用途正交。
// 開啟讀寫二進位檔
std::fstream fs;
fs.open("data.bin", std::ios::in | std::ios::out | std::ios::binary);
// 檢測是否包含輸入模式
if (fs.rdstate() & std::ios::in) { /* ... */ }
記住:組合用 |,檢測用 &,切換用 ^,清除用 ~&。