首頁 >常見問題 >c語言可以處理的檔案類型是什麼

c語言可以處理的檔案類型是什麼

青灯夜游
青灯夜游原創
2022-09-19 15:53:239012瀏覽

c語言可以處理的檔案類型是:文字檔案和二進位檔案。 C語言所能夠處理文件是按照存放形式分為文本文件和二進位文件:1、文本文件存儲的是一個ASCII碼,文件的內容可以直接進行輸入輸出;2、二進製文件直接將字符存儲,不能將二進制文件的內容直接輸出到螢幕上。

c語言可以處理的檔案類型是什麼

本教學操作環境: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 "(讀寫)

#"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語言可以處理的檔案類型是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn