C語言文本方式和二進位方式開啟檔案區別

來源:互聯網
上載者:User

我們都知道,文字檔和二進位檔案在電腦上面都是以0,1儲存的,那麼兩者怎麼還存在差別呢?我覺得,對於編程人員,文字檔和二進位檔案就是一個聲明,指明了你應該以什麼方式(文本方式/二進位)開啟這個檔案用什麼函數讀寫這個檔案(讀寫函數),怎麼判斷讀到這個檔案結尾

具體的說: 1。以哪種方式開啟一個檔案? ANSI C規定了標準輸入輸出函數庫,用
fopen()函數開啟檔案。fopen()函數的調用方式一般為:

FILE *fp;

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

使用檔案方式見下表:

使用檔案方式

含義

"r"(唯讀) 為輸入開啟一個文字檔
"w"(唯寫) 為輸出開啟一個文字檔
"a"(追加) 為追加開啟一個文字檔
"rb"(唯讀) 為輸入開啟一個二進位檔案
"wb"(唯寫) 為輸出開啟一個二進位檔案
"ab"(追加) 為追加開啟一個二進位檔案
"r+"(讀寫) 為讀/寫開啟一個文字檔
"w+"(讀寫) 為讀/寫建立一個文字檔
"a+"(讀寫) 為讀/寫開啟一個文字檔
"rb+"(讀寫) 為讀/寫開啟一個二進位檔案
"wb+"(讀寫) 為讀/寫建立一個二進位檔案
"ab+"(讀寫) 為讀/寫開啟一個二進位檔案
同一個檔案從磁碟讀取檔案到記憶體(程式資料區或者緩衝區)時,兩種方式下,記憶體中的內容一般不相同,這就是 兩種開啟檔案的實質性差別。這裡要說一個背景,那就是在windows下,它會做一個處理,就是寫檔案時,分行符號會被轉換成斷行符號,分行符號存在磁碟檔案上,而讀磁碟上的檔案時,它又會進行逆處理,就是把檔案中連續的斷行符號,分行符號轉換成分行符號。因此,在讀取一個磁碟檔案時,文本方式讀取到檔案內容很有可能會比二進位檔案短,因為文本方式讀取要把斷行符號,換行兩個字元變成一個字元,相當於截短了檔案。但是為什麼僅僅是可能呢?因為可能文中中不存在連著的45,42這兩個位元組(45是CR斷行符號的ASCII碼,42是分行符號CL的ASCII碼),也就不存在“截短”操作了,因此讀到的內容是一樣的。具體的來說,檔案檔案(以文本方式寫的),最好以文本方式讀。二進位檔案(以二進位方式寫的),最好以二進位方式讀。不然可能會不正確。上面的已經分析了。 2.以什麼函數讀寫檔案? 資料怎麼在磁碟上寫不是由檔案開啟檔案決定的,而是由寫函數決定的。資料怎麼從磁碟上讀也不是由檔案開啟檔案決定的,而是由讀函數決定的。 上面說的資料怎麼寫是說指,一種類型的變數是怎麼存的?比如int 12,可以直接存12的二進位碼(4個位元組),也可以存字元1,字元2.資料怎麼讀的是指,我要讀一個int變數,是直接讀sizeof(int)個位元組,還是一個字元一個字元的讀,直到讀到的字元不是數字字元。C裡面有兩組檔案讀寫函數恰好支援上面兩種方式的讀寫:1.fread(buffer,size,count,fp),fwrite(buffer,size,count,fp)。用來讀寫一個資料區塊。它對應的是第一種儲存方式。直接按類型的位元組長度指定讀寫的位元組數。2fprintf函數和fscanf函數.它對應的是第二種讀寫方式。即以字元的方式讀寫。(fprintf函數、fscanf函數與printf函數、scanf函數的作用相仿,都是格式化讀寫函數。fprintf和fscanf函數的讀寫對象是磁碟檔案,而printf和scanf函數的讀寫對象是終端。)它們的一般調用格式為:

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

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

3怎麼判斷檔案尾?

在 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也讀取出來了;具體見http://baike.baidu.com/view/656648.htm

4.知道一個檔案是文字檔,還是二進位檔案,更多的“提醒”我們,應該選擇哪種讀寫函數。

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

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

我們記住

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

如果我們要操作一個二進位檔案,那麼我們就以二進位方式開啟(理論上也可以以檔案方式開啟,但是如果寫的位元據裡面有45時,會轉化成45,42儲存,見1.這是很有可能發生的)。同時讀寫的時候用fread,fwrite這兩個函數。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.