在學習c語言檔案操作後,我們都會知道開啟檔案的函式是fopen,也知道它的第二個引數是 標誌字串。其中,如果字串中出現'b',則表明是以開啟二進位制(binary)檔案,否則是開啟文字檔案。
那麼什麼是文字檔案,什麼是二進位制檔案呢? 可能大多數人都沒有仔細考慮過。
在windows和dos系統中,狹義的文字檔案是指擴充套件名為txt的檔案。實際上,那些沒有規定格式的,由可理解的的ascii以及其他編碼文字組成的檔案都是文字檔案,如c源程式檔案,html超文字,xml。除此之外的其他檔案都是二進位制檔案,如word檔案doc,圖象格式檔案jpg。
但是,所謂使用fopen標誌開啟文字檔案與二進位制檔案的說法並不準確。正確的說法應該是--以文字方式和二進位制方式開啟檔案。因為我們用兩種方式都可以任意的檔案。
即使這樣,為什麼還要區分兩種方式呢?
這是因為這兩種方式在讀寫檔案時的操作是不一樣的。
二進位制方式很簡單,讀檔案時,會原封不動的讀出檔案的全部內容,寫的時候,也是把記憶體緩衝區的內容原封不動的寫到檔案中。
而文字方式就不一樣了,在寫(應該為讀)檔案時,會將換行符號crlf(0x0d 0x0a)全部轉換成單個的0x0a,並且當遇到結束符ctrlz(0x1a)時,就認為檔案已經結束。相應的,寫檔案時,會將所有的0x0a換成0x0d0x0a。
所以,若使用文字方式開啟二進位制檔案時,就很容易出現檔案讀不完整,或內容不對的錯誤。即使是用文字方式開啟文字檔案,也要謹慎使用,比如複製檔案,就不應該使用文字方式。
要特別注意的是,上面這樣的說法僅適用於dos和windows系統。在unix和其他一些系統中,沒有文字方式和二進位制方式的區分,使不使用'b'標誌都是一樣的。這是由於不同作業系統對文字檔案換行符的定義,和c語言中換行符的定義有所不同而造成的。
如上文已提到,dos和windows系統使用crlf(0x0d 0x0a)雙位元組作為文字檔案換行符,而unix文字檔案的換行符只有乙個位元組lf(0x0a)為。在c語言中,也是以lf即'\n'為換行符。
由於dos/windows定義的換行符和c語言的不一致,c語言的標準輸入輸出函式適行讀寫文字檔案時,就適行了crlf->lf的轉換。而unix的定義和c語言的是一樣的,就不必轉換了。
那麼,為什麼會有定義不一致的情況呢,這純屬歷史原因。當初c是在unix上發展的,對換行的定義自然就一樣了。其後c被引入到dos系統,為了使原有的c程式能不加修改的讀寫dos的文字檔案,所以就在檔案讀寫上做了修改。隨著dos/windows成為主流平台,這個當初為了相容而做的修改給眾多的c語言開發者添了這樣乙個小小的麻煩。
這個「小小」麻煩浪費了我一上午時間,還好找到了這個帖子,也不還鬱悶著呢。所以以後最好用 b的方式開啟檔案。
fopen,文字檔案與二進位制檔案
在學習c語言檔案操作後,我們都會知道開啟檔案的函式是fopen,也知道它的第二個引數是標誌字串。其中,如果字串中出現 b 則表明是以開啟二進位制 binary 檔案,否則是開啟文字檔案。那麼甚麼是文字檔案,甚麼是二進位制檔案呢?可能大多數人都沒有仔細考慮過。在windows和dos系統中,狹義的文字...
VS開發 fopen 文字檔案與二進位制檔案區別
在學習c語言檔案操作後,我們都會知道開啟檔案的函式是fopen,也知道它的第二個引數是 標誌字串。其中,如果字串中出現 b 則表明是以開啟二進位制 binary 檔案,否則是開啟文字檔案。那麼什麼是文字檔案,什麼是二進位制檔案呢?可能大多數人都沒有仔細考慮過。在windows和dos系統中,狹義的文...
文字檔案與二進位制檔案
從本質上說所有檔案都是二進位制檔案,文字i o是在二進位制i o基礎上提供的一層抽象,它封裝了字元的編碼和解碼過程。在文字i o中自動進行編碼與解碼。在windows和dos系統中,狹義的文字檔案是指擴充套件名為txt的檔案。實際上,那些沒有規定格式的,由可理解的的ascii以及其它編碼文字組成的檔...