C語言讀寫文件兩種方式ASCII 和 二進制。


C語言讀寫文件有兩種方式ASCII 和 二進制。現在舉例說明:

內存中的字符或字符串都是文本模式(unicode編碼存儲,統一長度,定長碼,方便)
內存中的其他變量都是以二進制編碼存儲
程序的代碼以文本模式ASCII碼方式存儲

1.windows系統中,文本模式下文件以" \r\n"代表換行。若以文本模式打開文件,並用fputs等函數寫入換行符"\n"時,函數會自動在"\n"前面加上"\r"。即實際寫入文件的是"\r\n" 。讀取的時候自動去掉\r,將\n寫入內存。

2.在類Unix/Linux系統中文本模式下,文件以"\n"代表換行所以Linux系統中在文本模式和二進制模式下並無區別。

注:Windows 采用 \r\n 是有原因的,Windows 采用了傳統的英文打字機的模式。
想想看英文打字機是如何換行的呢?英文打字機是選擇將小車退回至起點,
這個過程稱為回車(carriage return, CR),隨后把小車調至下一行的位
置,這個過程稱為換行(line feed, LF),這樣就完成了英文打字機中換
行過程。
回車(CR)在計算機中使用 ASCII 為 13 的字符來表示,換行(LF)使用
ASCII 為 10 的字符來表示。這也就是 Windows 的換行采用 \r\n 來表示
的原因。

3.當用二進制模式讀取windows下代表換行的\r\n時,不能自動去掉\r,這樣讀入內存的數據多了一個‘\r’,造成跟在‘\r’后面的二進制位右移,讀取必然會出錯!

4.如果在文件中讀到0x1B,文本模式會認為這是文件結束符,也就是二進制模型不會對文件進行處理,而文本方式會按一定的方式對數據作相應的轉換。

5.用文本模式寫文件,讀取時也要用文本模式,二進制模式同樣。

將二進制數據直接寫入到文件中

Int x = 128;

fp = fopen("g:\\1.txt","wb");

fwrite(&a,4,1,fp);

這時候1.txt中的內容如果用記事本打開,亂碼,因為記事本是按照ASCII編碼方式(現在系統默認使用的都是GB2312 unicode等編碼)解釋文件,而128在內存里面是四字節的0000 0000 1000 0000,這樣用系統的編碼解釋肯定出錯。

如果將128存儲為asii形式,即字符串的形式,內存中存放相應的ascii碼61 62 63(這為了方便些了十進制,內存中二進制) 此時再寫到文件里面,這樣打開txt的時候文件就能正常的解釋編碼,從而實現從編碼到字符的映射!

C語言存取文件時候有文本模式和二進制模式,即r和rb、w和wb,這里的影響僅限於上述1、2,對fputc fwrite函數寫到文件的內容沒有其他影響,仍然都是內容中的二進制數據按字節寫出到文件中。而 fprintf則將二進制轉換成ASCII輸出到文件中,fscanf將讀取的ascii碼轉換成二進制放到內存中,效率略低。

fgetc fputc 都是按照字節存取,無論文本模式還是二進制模式打開,都按照一個一個字節讀取,不存在\r\n問題。

 

附一篇不錯的文章:

ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應一個字節,用於存放對應的ASCII碼。例如,數5678的存儲形式為:
ASC碼:00110101 00110110 00110111 00111000
      ↓        ↓       ↓         ↓
十進制碼:   5     6      7       8 共占用4個字節。ASCII碼文件可在屏幕上按字符顯示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內容。 由於是按字符顯示,因此能讀懂文件內容。 二進制文件是按二進制的編碼方式來存放文件的。 例如, 數5678的存儲形式為: 00010110 00101110只占二個字節。二進制文件雖然也可在屏幕上顯示, 但其內容無法讀懂。C系統在處理這些文件時,並不區分類型,都看成是字符流,按字節進行處理。 輸入輸出字符流的開始和結束只由程序控制而不受物理符號(如回車符)的控制。 因此也把這種文件稱作"流式文件"。 一個文件可以以文本模式或二進制模式打開,這兩種的區別是:在文本模式中回車被當成一個字符'\n',而二進制模式認為它是兩個字符0x0D,0x0A;如果在文件中讀到0x1B,文本模式會認為這是文件結束符,也就是二進制模型不會對文件進行處理,而文本方式會按一定的方式對數據作相應的轉換。 文件看作是由一個一個字節(byte) 組成的,那么文本文件中的每個字節的最高位都是0,也就是說文本文件使用了一個字節中的七位來表示所有的信息,而二進制文件則是將字節中的所有位都用上了。 不管是二進制文件也好,還是文本文件也好,都是一連串的0和1,但是打開方式不同,對於這些0和1的處理也就不同。如果按照文本方式打開,在打開的時候會進行translate,將每個字節轉換成ASCII碼,而以按照二進制方式打開的話,則不會進行任何的translate; 文本文件和二進制文件在編輯的時候,使用的方式也是不同的。譬如,你在記事本中進行文本編輯的時候,你進行編輯的最小單位是字節(byte);而對二進制文件進行編輯的話,最小單位則是位(bit),當然我們都不會直接通過手工的方式對二進制文件進行編輯了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM