二進位制檔案

2021-07-02 18:47:58 字數 3335 閱讀 1579

本質上是文字檔案是把檔案資訊先轉化成以字元編碼的ascii碼,再儲存ascii的二進位制**。而二進位制檔案是直接把檔案資訊編碼成二進位制儲存。因此在讀取的時候要考慮記憶體中二進位制**應該怎麼樣解釋。

二進位制檔案的讀取是是要告訴元素的型別(編碼方式),文字檔案則預設為char型別。

文字檔案是一種特殊的二進位制檔案

稍微了解c程式設計的人都知道,文字檔案和二進位制檔案在計算機上面都是以0,1儲存的,那麼兩者怎麼還存在差別呢?對於程式設計人員來說,文字檔案和二進位制檔案就是乙個宣告,指明了你應該以什麼方式(文字方式/二進位制)開啟這個檔案,用什麼函式讀寫這個檔案(讀寫函式),怎麼判斷讀到這個檔案結尾等。

具體分析如下:

一、以哪種方式開啟乙個檔案

ansi c規定了標準輸入輸出函式庫,用 fopen()函式開啟檔案。fopen()函式的呼叫方式一般為:

file *fp;

fp=fopen(檔名,使用檔案方式);

使用檔案方式見下表:

使用檔案方式

含義"r"(唯讀)

為輸入開啟乙個文字檔案

"w"(只寫)

為輸出開啟乙個文字檔案

"a"(追加)

為追加開啟乙個文字檔案

"rb"(唯讀)

為輸入開啟乙個二進位制檔案

"wb"(只寫)

為輸出開啟乙個二進位制檔案

"ab"(追加)

為追加開啟乙個二進位制檔案

"r+"(讀寫)

為讀/寫開啟乙個文字檔案

"w+"(讀寫)

為讀/寫建立乙個文字檔案

"a+"(讀寫)

為讀/寫開啟乙個文字檔案

"rb+"(讀寫)

為讀/寫開啟乙個二進位制檔案

"wb+"(讀寫)

為讀/寫建立乙個二進位制檔案

"ab+"(讀寫)

為讀/寫開啟乙個二進位制檔案

同乙個檔案從磁碟讀取檔案到記憶體(程式資料區或者快取區)時,兩種方式下,記憶體中的內容一般不相同,這就是兩種開啟方式的實質性差別。

1.在windows系統中,文字中,"\r\n"代表換行,程式中"\n"代表換行。若以文字模式開啟檔案,並用fputs等函式寫入換行符"\n"時,函式會自動在"\n"前面加上"\r"。即實際寫入檔案的是"\r\n" 。 

2.在類unix/linux系統中文字模式下,檔案以"\n"代表換行。所以linux系統中在文字模式和二進位制模式下並無區別。

這裡要說乙個背景,那就是在windows下,它會做乙個處理,就是寫檔案時,換行符會被轉換成回車,換行符存在磁碟檔案上,而讀磁碟上的檔案時,它又會進行逆處理,就是把檔案中連續的回車,換行符轉換成換行符。

因此,在讀取乙個磁碟檔案時,文字方式讀取到檔案內容很有可能會比二進位制檔案短,因為文字方式讀取要把回車,換行兩個字元變成乙個字元,相當於截短了檔案。但是為什麼僅僅是可能呢?因為可能文字中不存在連著的45,42這兩個位元組(45是cr回車的ascii碼,42是換行符cl的ascii碼),也就不存在「截短」操作了,因此讀到的內容是一樣的。

具體的來說,檔案檔案(以文字方式寫的),最好以文字方式讀。二進位制檔案(以二進位制方式寫的),最好以二進位制方式讀。不然可能會不正確。

二、以什麼函式讀寫檔案

資料怎麼在磁碟上寫不是由檔案開啟方式決定的,而是由寫函式決定的。資料怎麼從磁碟上讀也不是由檔案開啟方式決定的,而是由讀函式決定的。

上面說的資料怎麼寫是指,一種型別的變數是怎麼存的?比如int 12,可以直接存12的二進位製碼(4個位元組),也可以存字元1,字元2.

資料怎麼讀的是指,我要讀乙個int變數,是直接讀sizeof(int)個位元組,還是乙個字元乙個字元的讀,直到讀到的字元不是數字字元。

c裡面有兩組檔案讀寫函式恰好支援上面兩種方式的讀寫:

1.fread(buffer,size,count,fp),fwrite(buffer,size,count,fp)。用來讀寫乙個資料塊。它對應的是第一種儲存方式。直接按型別的位元組長度指定讀寫的位元組數。

2.fprintf函式和fscanf函式.它對應的是第二種讀寫方式。即以字元的方式讀寫。(fprintf函式、fscanf函式與printf函式、scanf函式的作用相仿,都是格式化讀寫函式。fprintf和fscanf函式的讀寫物件是磁碟檔案,而printf和scanf函式的讀寫物件是終端。)

它們的一般呼叫格式為:?

1 2 

fprintf(檔案指標,格式字串,輸出列表);

fscanf(檔案指標,格式字串,輸入列表);

三、怎麼判斷檔案尾

在c語言,或更精確地說成 c標準函式庫中,有乙個特別的字元eof(stdio.h中這個定義 #define eof (-1) ),它表示:檔案結束符(end of file)。在while迴圈中以eof作為檔案結束標誌,這種以eof作為檔案結束標誌的檔案,必須是文字檔案。在文字檔案中,資料都是以字元的ascii**值的形式存放。我們知道,ascii**值的範圍是0~255,不可能出現-1,因此可以用eof作為檔案結束標誌。

但是,c語言中,當把資料以二進位制形式存放到檔案中時,就會有-1值的出現,此時不能採用eof作為二進位制檔案的結束標誌。為解決這個問題,ansi c提供乙個feof函式,用來判斷檔案是否結束。如果遇到檔案結束,函式feof(fp)的值為1,否則為0.

feof函式既可用以判斷二進位制檔案是否結束,也可以用以判斷文字檔案是否結束。但是要注意feof用以判斷文字檔案尾時,如果**編寫不當,可能會把文字文中中的檔案結束符eof也讀取出來了;具體可以參考中feof函式的用法。

正如前文所說的,資料怎麼存不是由檔案開啟方式決定的,而是由讀寫函式決定的。

比如說,我們以二進位制檔案的方式開啟乙個檔案(實際上只是指明了要進行換行符的轉換),它更多的是代表一種理念(虛的):我「希望」這個檔案裡面的資料是這樣的,int型別佔4位元組,char佔1個位元組。這種模式下,我用fread(buffer,size0f(int),1,fp)讀取乙個int到int變數中。

這裡需要記住:

我們在對乙個檔案進行操作以前,首先,我們要清楚這個檔案到底是文字檔案還是二進位制檔案。檔案檔案用文字方式開啟,二進位制檔案用二進位制方式開啟

如果我們要操作乙個二進位制檔案,那麼我們就以二進位制方式開啟(理論上也可以以檔案方式開啟,但是如果寫的二進位制資料裡面有45時,會轉化成45,42儲存,如前文所述。這是很有可能發生的)。同時讀寫的時候用fread,fwrite這兩個函式。

如果我要操作乙個文字檔案,那麼我們就以文字的方式開啟(理論上也可以以二進位制方式開啟,但是不保險)。同時讀寫的時候用讀寫字元的那些函式fprintf,fscanf ,fgetc,fputc,putw,getw,fgetc,fputs.

二進位制檔案

二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...

二進位制檔案

二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...