**:
我們都知道,文字檔案和二進位制檔案在計算機上面都是以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)。用來讀寫乙個資料塊。它對應的是第一種儲存方式。直接按型別的位元組長度指定讀寫的位元組數。 2
fprintf
函式和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也讀取出來了
;具體見
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語言採用文字方式和二進位制方式開啟檔案的區別分析
投稿 shichen2014 字型 增加 稍微了解c程式設計的人都知道,文字檔案和二進位制檔案在計算機上面都是以0,1儲存的,那麼兩者怎麼還存在差別呢?對於程式設計人員來說,文字檔案和二進位制檔案就是乙個宣告,指明了你應該以什麼方式 文字方式 二進位制 開啟這個檔案,用什麼函式讀寫這個檔案 讀寫函式...
C語言採用文字方式和二進位制方式開啟檔案的區別分析
稍微了解c程式設計的人都知道,文字檔案和二進位制檔案在計算機上面都是以0,1儲存的,那麼兩者怎麼還存在差別呢?對於程式設計人員來說,文字檔案和二進位制檔案就是乙個宣告,指明了你應該以什麼方式 文字方式 二進位制 開啟這個檔案,用什麼函式讀寫這個檔案 讀寫函式 怎麼判斷讀到這個檔案結尾等。具體分析如下...
C語言採用文字方式和二進位制方式開啟檔案的區別分析
稍微了解c程式設計的人都知道,文字檔案和二進位制檔案在計算機上面都是以0,1儲存的,那麼兩者怎麼還存在差別呢?對於程式設計人員來說,文字檔案和二進位制檔案就是乙個宣告,指明了你應該以什麼方式 文字方式 二進位制 開啟這個檔案,用什麼函式讀寫這個檔案 讀寫函式 怎麼判斷讀到這個檔案結尾等。具體分析如下...