二進制文件和文本文件讀取的區別小議

在學習了文件的輸入和輸出之後,本人一直存在一個疑問,我想可能也是好多人的疑問。那就是二進制文件和文本文件中的內容到底是怎麼讀寫的?我們爲什麼打開二進制文件看到的是一些亂碼?


由於今天的時間充足,編找了一點相關資料,並總結了一下。


文件分爲兩類:文本文件,二進制文件。
文件在計算機中存儲的信息是由1或0表示的,所以按照嚴格意義來說,兩者不存在根本區別。
但是兩者之間又有區別:
個人認爲,他們最大的區別是文本文件屬於字符編碼,而二進制文件屬於字符串編碼。


下面我們看個例子:


#include<stdio.h>

int main(void)
{
	int num = 52761;
	char c[6] = "52761";
	FILE *fp;
	int *p;

	if((fp = fopen("txt.txt","w")) == NULL)
	{
		fprintf(stderr,"can't open txt.txt.\n");
		exit(1);
	}
	p = #
	fprintf(fp,"%s\n","52761");
	fprintf(fp,"%d\n",*p);
	fclose(fp);

	if((fp = fopen("binary","wb")) == NULL)
	{
		fprintf(stderr,"can't open binary.\n");
		exit(1);
	}
	fwrite(p, sizeof(int), 1, fp);
	fwrite(c,sizeof(c),sizeof(c)/sizeof(char),fp);
	fclose(fp);

	return 0;
}

接下來,我在win7的操作系統32位機的環境下,我用UltraEdit分別查看txt.txt和binary兩個文件裏的內容:
其中txt.txt中存儲的內容如下:


相信你已經注意到了,無論我是用十進制格式輸出還是字符串格式輸出,其存儲內容全部都是將各個數字轉化爲字符進行存儲的。但是,仔細的你會發現,怎麼每個後面都有0D和0A呢!我們知道,0A代表‘\n’,我們在輸出的時候都加了‘\n’,所以有他便不足爲奇了,但是怎麼又有0D呢!
下面我就摘抄一段《c primer plus》(第五版  355頁)裏的一段話,幫助大家理解:ANSI 要求提供的兩種文件視圖是文件視圖和二進制視圖。在二進制視圖中,文件的每個字節都可以爲程序所訪問。在文本視圖中,程序看到的內容和文件的內容有可能不同。例如,使用文本視圖讀取文件時,將吧行尾的本地環境表示法映射爲c視圖。與之類似,在輸出的時候,也會將c視圖中的行尾表示映射爲本地環境表示法。例如,MS-DOS文本文件用回車符合換行符的組合\r\n來表示行尾。Macintosh文本文件只用一個回車\r來表示行尾。c程序使用一個\n表示行尾。所以,如果c程序以文本視圖模式處理一個MS-DOS文本文件,在讀取文件時,它會將\r\n轉化爲\n,在寫入文件的時候,它會將\n轉化爲\r\n;而對於Macintosh文本文件的文本視圖,讀取文件時它會將\r轉化爲\n,在寫入文件的時候他會將\n轉化爲\r。看到這,我相信,你就不難理解爲什麼還出現\r了。

binary中存儲的內容如下:


接下來,我們再看看二進制文件中的存儲內容。如你所見19 CE所對應的內容正好是我們所不懂的,且稱之爲亂碼的內容。其實 19 CE就是52761的實際值而已。而後面的數字,是對應的字符串映射到內存中,再由內存中保存的內容寫入在文件裏,因此,這一串字符串是我們能夠讀懂的,當然也就清楚的說明了,爲什麼,打開一個二進制文件時,我們可以看到一些,我們能夠看得懂的內容。


總結:從這,我們可以這樣想,其實,在你存儲文件時,操作系統並不會讓你每輸入一個值就寫到文件中(不然多次進行內部設備與外部設備之間的輪換讀取,這效率也太低了),而是會給你分配一段緩衝區,二進制文件就是講緩衝區的內容原封不動的放進文件;文本文件卻是在你每一次輸入之後,將你輸入的值轉換爲對應的編碼值再存放在文件中。在這,我們也可以看出處理兩文件是的效率問題了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章