昨天在看一篇文章的時(shí)候,突然想起了這個(gè)基礎(chǔ)性的問(wèn)題,自己一直對(duì)它的區(qū)別不是很清楚,于是今天上午研究下了,分享下自己的理解。(對(duì)它很清楚的同學(xué)們可以略過(guò)此篇文章)
從存儲(chǔ)方式來(lái)說(shuō),文件在磁盤上的存儲(chǔ)方式都是二進(jìn)制形式,所以,文本文件其實(shí)也應(yīng)該算二進(jìn)制文件。那么他們的區(qū)別呢,各自的優(yōu)缺點(diǎn)呢?不急,我慢慢道來(lái)。
先從他們的區(qū)別來(lái)說(shuō),雖然都是二進(jìn)制文件,但是二進(jìn)制代表的意思不一樣。打個(gè)比方,一個(gè)人,我們可以叫他的大名,可以叫他的小名,但其實(shí)都是代表這個(gè)人。二進(jìn)制讀寫是將內(nèi)存里面的數(shù)據(jù)直接讀寫入文本中,而文本呢,則是將數(shù)據(jù)先轉(zhuǎn)換成了字符串,再寫入到文本中。下面我用個(gè)例子來(lái)說(shuō)明。
我們定義了一個(gè)結(jié)構(gòu)體,表示一個(gè)學(xué)生信息,我們打算把學(xué)生的信息分別用二進(jìn)制和文本的方式寫入到文件中。
struct Student
{
int num;
char name[20];
float score;
};
我們定義兩個(gè)方法,分別表示內(nèi)存寫入和文本寫入
//使用二進(jìn)制寫入
void write_to_binary_file()
{
struct Student stdu;
stdu.num = 111;
sprintf_s(stdu.name,20,"%s","shine");
stdu.score = 80.0f;
fstream binary_file("test1.dat",ios::out|ios::binary|ios::app); //此處省略文件是否打開失敗的判斷
binary_file.write((char *)&stdu,sizeof(struct Student));//二進(jìn)制寫入的方式
binary_file.close();
}
//文本格式寫入
void write_to_text_file()
{
struct Student stdu;
stdu.num = 111;
sprintf_s(stdu.name,20,"%s","shine");
stdu.score = 80.0f;
FILE *fp = fopen("test2.dat","a+"); //此處省略文件是否打開失敗的判斷
fprintf(fp,"%d%s%f",stdu.num,stdu.name,stdu.score); //將數(shù)據(jù)轉(zhuǎn)換成字符串(字符串的格式可以自己定義)
fclose(fp);
}
//MAIN函數(shù)調(diào)用前面兩個(gè)方法
int _tmain(int argc, _TCHAR* argv[])
{
write_to_binary_file();
write_to_text_file();
return 0;
}
我們來(lái)看下,文件里面的格式
2進(jìn)制文件
文本文件
2進(jìn)制文件里面將111編碼成6F,1個(gè)字節(jié),這剛好是111的16進(jìn)制表示,而文本文件中則寫成31,31,31用了3個(gè)字節(jié),表示111。73 68 69 6E 65 表示shine,之后2進(jìn)制文件里是幾個(gè)連續(xù)的FE,而文本文件中是38 30......文本文件將浮點(diǎn)數(shù)80.000000用了38(表示8) 30(表示0) 2E(表示.) 30(表示0) 30(表示0) 30(表示0) 30(表示0) 30(表示0) 30(表示0),二進(jìn)制文件用了4個(gè)字節(jié)表示浮點(diǎn)數(shù)00 00 A0 42
通過(guò)這里我們可以初見端倪了,二進(jìn)制將數(shù)據(jù)在內(nèi)存中的樣子原封不動(dòng)的搬到文件中,文本格式則是將每一個(gè)數(shù)據(jù)轉(zhuǎn)換成字符寫入到文件中,他們?cè)诖笮∩希季稚隙加兄鴧^(qū)別。由此可以看出,2進(jìn)制文件可以從讀出來(lái)直接用,但是文本文件還多一個(gè)“翻譯”的過(guò)程,因此2進(jìn)制文件的可移植性好。
posted on 2012-07-12 09:59
梨樹陽(yáng)光 閱讀(13022)
評(píng)論(5) 編輯 收藏 引用 所屬分類:
C