歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

文件讀寫: 二進制方式和文本方式的區別

首先要明白一點,就是無論你用哪種語言進行程序設計,也無論你用哪個函數進行文件操作(庫函數也好,直接操作系統API也好),最終的文件打開的操作都是由操作系統來進行的,因此各種語言的情況從本質上來說都是相同的。
  用二進制模式打開一個文件的時候,文件本身的內容和你編寫程序時用函數讀到的內容完全相同(或者說和磁盤上的內容完全相同)。

  但是如果用了文本模式,那麼操作系統在將文件內容傳給上層程序(庫函數,或者是你的程序)時,或者上層程序通過操作系統向文件寫入內容時,操作系統都會預先進行一層預處理(或者說轉義),具體過程依賴於操作系統的實現。在Windows+VC下,最常見就是將回車符"\r\n"(沒有引號,且\作轉義符用,下同)解釋成"\n"(讀出時),將"\n"解釋成"\r\n"(寫入時)。而在Linux下沒有這層轉換,這也是Windows和Linux文本文件不通用的原因。
  除此以外,兩種打開方式其實是大同小異的。
  舉個例子,設有一文件file.dat內容為"ABC\r\nABC",那麼在下面的代碼中,讀到的內容將是"ABC\r\nABC":
  fp = fopen("file.dat","rb");
  while(fgetc(fp)!=EOF);
  而在下面的代碼中,讀到的內容卻是"ABC\nABC":
  fp = fopen("file.dat","rt");
  while(fgetc(fp)!=EOF);
  還有一點要注意的是關於文件定位的問題。在文本模式下最好少用fseek,因為有了庫函數的那層轉義的存在,fseek會有一些近乎於奇怪的行為。我在Windows+VC下試驗發現,盡管在文本模式下"\r\n"還是被當作兩個字符計算的,但是當你把文件指針定位到"\r\n"處時,讀到的兩個字節都是"\n"。
C的文本方讀寫與二進制讀寫的差別僅僅體現在回車換行符的處理上.文本方式寫時,每遇到一個''\n''(0AH換行符),它將其換成''\r\n''(0D0AH,回車換行),然後再寫入文件;當文本讀取時,它每遇到一個''\r\n''將其反變化為''\n'',然後送到讀緩沖區.正因為文本方式有''\n''--''\r\n''之間的轉換,其存在轉換耗時.二進制讀寫時,其不存在任何轉換,直接將寫緩沖區中數據寫入文件.
參考資料:
http://loveli0917.blog.163.com/blog/static/13315265520113524336142/
http://topic.okbase.net/200611/2006112014/2778420.html
http://hi.baidu.com/%B2%C5%D3%C9%D0%C4%C9%FA/blog/item/eaa9f646fb64e532869473c2.html
Copyright © Linux教程網 All Rights Reserved