fopen 的第二個引數為什麼會採用字串形式?

時間 2021-05-05 21:37:43

1樓:邱昊宇

除了已經提到的 enum 比 fopen 出現得晚外,mode 引數使用字串比使用整型更方便擴充套件

fopen 從 C89 開始一直允許你在正常的 mode 後新增額外字元,效果由各個實現自行定義。比如 MSVC 和 libc 都允許你在後面新增 ccs=STRING 來指定字符集。

標準委員會也認同這樣的做法,比如 Rationale for C (C99,第 150 頁)裡有這樣的說明:

the mode string argument. For instance,

file1 = fopen(file1name, "wb,reclen=80");

might be a reasonable extension on a system that provides record-oriented binary files and allows a programmer to specify record length.

後續的標準也有吸收這種擴充套件的例子,比如 C11「招安」了原先和「ccs=STRING」一樣地位的「x」模式。

也許,把這個 mode 引數理解為小型 DSL 更貼切吧……

回頭看看第一版 K&R 的話,你會看到當時尚未標準化的 C 裡,fopen 只允許 "r"、"w"、"a" 三種取值。第八章中結合 open(2) 編寫的示例實現中也僅檢查了 *mode 的值,並沒有發揮「字串」的功用。

為什麼會這樣呢?試想,如果類似 open(2) 把 mode 作為位掩碼(bitmask)使用,則有效的單獨的功能數量受限於 int 的大小。比如最小的 int 只有 16 位,則最多只能定義 16 個可選項(雖然它們的組合可以很多)。

而如果是字串,則理論上可以大得多。

現在 open(2) 的 mode 雖然也只有十幾個可選項——尚未觸及到 16 個的天花板——但後來 open(2) 多搞出來了乙個追加了 mode_t 的版本,同時又允許用 ioctl(2) 負責前面所說的額外擴充套件……個人覺得,都沒有 fopen 用字串解決問題來得簡單。

當然這些也可能只是我們這些後人的猜測,當年只是突發奇想。有興趣的童鞋可以發郵件問問 Michael Lesk 老爺子當年你為啥這麼搞。

2樓:機犬

因為早期的程式設計師眼裡單個 char 和 int 沒區別,你以為每個片語都要迴圈判斷一遍但其實每乙個字元只需要 switch 一次就行(並不等同其他高階語言中的 switch string,那就是個 if 的語法糖)。

3樓:Milo Yip

應該是先有 fopen 才有 enum。

4樓:

因為其它表示方法沒法明確表示出幾種模式的組合比如唯讀

只寫可讀寫

c++的標準庫採用了一種更「現代」的方式

導致c++檔案流的開啟更蛋碎了

從幾個字元變成幾排字元

5樓:lichray

Iostreams 裡用了 enum, 於是 "wb+" 要寫成這樣:

std::

fstream

fin(fn,

std::

ios_base

::binary

|std

::ios_base

::out

|std

::ios_base

::in

|std

::ios_base

::trunc

);hmm, 你們用吧。See also std::basic_filebuf::open - cppreference.com

6樓:「已登出」

如果用你說的整型,可能你現在又在問為啥採用整型,不用字串型別。。。

如果我說當初寫這個API的人突然覺得每次查表看下1表示啥2表示啥比較蛋碎,就用了字串,更明了,你信麼?

你為什麼選擇讀第二個碩士?

Rebecca 我認識過兩個人,另乙個是在美國英國香港讀了好幾個碩士的姐姐,生了三個寶寶,在聊天的時候得知她一生都在尋求自己對教育的理想。讀中文,覺得不夠貼近教育,就又去讀了教育學,估計是覺得欠缺了心理學的知識,然後繼續讀了心理學,真心是那種為了豐富自己的實力而選擇讀碩士。 很簡單因為第二個 Msc...

科二S彎第二個彎怎麼看點啊,老是第二個彎出問題,後天就要考試了 ?

腦袋伸出窗戶外,看著車輪打方向,就可以了。和我一塊考試的有六個人都不會看s彎的點,但是都全過,慢慢開就好 壓低車速,看兩側後視鏡,看到後輪離哪邊線太近的話就往相反方向打方向盤。每個教練教的都不一樣,你應該問一下你教練怎麼看.我一般是看右視鏡邊貼著地上的線走。只能給你一點建議,這是我們教練教的 我是壓...

分 ,第二個 是什麼意思?

lovefob 一般來說在指別人說過說過某些話或者表達過某些意思的時候用這個。比較口語化的一種表達方式。可以換成 言 伝 這個句子翻譯成漢語的話就是人家 說了他 知道 還有一種可能就是表示一種強調的語氣。這種也是在日常生活中經常見到的。翻譯成漢語的話就是我tm明白!想象一下青春期的叛逆少年 這兩種情...