fopen,文本文件與二進制文件
2004-11-15 13:59
344 查看
在學習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語言開發者添了這樣一個小小的麻煩。
那麼甚麼是文本文件,甚麼是二進制文件呢? 可能大多數人都沒有仔細考慮過。
在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語言開發者添了這樣一個小小的麻煩。
相关文章推荐
- 如何配置Apache
- 网站项目管理规范手册
- 网站规划书浅析
- LINUX守护进程介绍
- window.open
- Tuxedo常见应用配置关注事项 (转自BEA中国网站)
- Windows 2003优化大全
- 英语学习各大媒体新闻杂志网站大全
- 在Windows中安装Apache2和PHP4的权威指南
- DNN资源网站 中国DNN 建立
- 网站结构设计规划书
- Apache Geronimo 1.0 M3 Released
- IE拖放漏洞详解二
- 推荐一个好的餐馆点评网站
- xml-了解 XML 架构
- 使用lilo/grub时找回忘记了的root口令(bjchenxu)
- 对中国软件一些想说的话(中印差距的回复)
- 突然觉得DirectX要比OPENGL好,不知为什么?
- 如何在Linux中访问硬盘DOS分区、软盘和光盘
- 实战SWT布局