首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ fstream open 模式參數為何用位元或 (|) 而非邏輯與 (&)?

     編輯:程式設計疑難解答

std::fstream::open 的 mode 參數常見寫法:std::ios::in | std::ios::out | std::ios::binary。為何用位元或 |?因為每個模式旗標佔用不同的位元位置,組合時需保留各自的位元,而非數值相加。

位元或 vs 數值相加

  • 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) { /* ... */ }

記住:組合用 |,檢測用 &,切換用 ^,清除用 ~&。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved