c語言可以處理的檔案型別是:文字檔案和二進位制檔案。C語言所能夠處理檔案是按照存放形式分為文字檔案和二進位制檔案:1、文字檔案儲存的是一個ASCII碼,檔案的內容可以直接進行輸入輸出;2、二進位制檔案直接將字元儲存,不能將二進位制檔案的內容直接輸出到螢幕上。
php零基礎到就業直播視訊課:進入學習
本教學操作環境:windows7系統、c99版本、Dell G3電腦。
在計算機中,對於輸入輸出均採用資料流的形式。檔案按照存取方式分為順序存取檔案和隨機存取檔案。按照儲存形式分為二進位制檔案和文字檔案。文字檔案儲存的是一個ASCII碼,檔案的內容可以直接進行輸入輸出。二進位制檔案直接將字元儲存,不能將二進位制檔案的內容直接輸出到螢幕上。所以,C語言所能夠處理檔案是按照存放形式分為文字檔案和二進位制檔案。
文字檔案和二進位制檔案的區別
文字檔案通常用來儲存肉眼可見的字元,比如.txt檔案、.c檔案、.dat檔案等,用文字編輯器開啟這些檔案,我們能夠順利看懂檔案的內容。
二進位制檔案通常用來儲存視訊、圖片、程式等不可閱讀的內容,用文字編輯器開啟這些檔案,會看到一堆亂碼,根本看不懂。
但是從物理上講,二進位制檔案和字元檔案並沒有什麼區別,它們都是以二進位制的形式儲存在磁碟上的資料。
我們之所以能看懂文字檔案的內容,是因為文字檔案中採用的是 ASCII、UTF-8、GBK 等字元編碼,文字編輯器可以識別出這些編碼格式,並將編碼值轉換成字元展示出來。
而二進位制檔案使用的是 mp4、gif、exe 等特殊編碼格式,文字編輯器並不認識這些編碼格式,只能按照字元編碼格式胡亂解析,所以就成了一堆亂七八糟的字元,有的甚至都沒見過。
如果我們新建一個 mp4 檔案,給它寫入一串字元,然後再用文字編輯器開啟,你一樣可以讀得懂,有興趣的讀者可以自己試試。
總起來說,不同型別的檔案有不同的編碼格式,必須使用對應的程式(軟體)才能正確解析,否則就是一堆亂碼,或者無法使用。
對於程式設計人員,文字檔案和二進位制檔案就是一個宣告,指明瞭你應該以什麼方式(文字方式/二進位制)開啟這個檔案,用什麼函數讀寫這個檔案(讀寫函數),怎麼判斷讀到這個檔案結尾。
具體的說:
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
相關推薦:《C視訊教學》
以上就是c語言可以處理的檔案型別是什麼的詳細內容,更多請關注TW511.COM其它相關文章!