windows下二進位制和文字檔案的區別

2021-09-20 07:48:18 字數 3166 閱讀 3094

先看兩段**:

/*開啟文字檔案,輸出換行符和回車符*/

/*開啟二進位制檔案,輸出換行符和回車符*/

造成以上現象的原因,主要二進位制檔案和文字檔案的不同。在計算機還沒有出現之前,有一種叫做電傳打字機的機器,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。

於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。乙個叫做「回車」,告訴打字機把列印頭定位在左邊界;另乙個叫做「換行」,告訴打字機把紙向下移一行。

這就是「換行」和「回車」的來歷,後來,計算機發明了,這兩個概念也就被般到了計算機上。那時,儲存器很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加乙個就可以。於是,就出現了分歧:

乙個直接後果是,unix/mac系統下的檔案在windows裡開啟的話,所有文字會變成一行;而windows裡的檔案在unix/mac下開啟的話,在每行的結尾可能會多出乙個^m符號。

本文開頭的兩段**,即為以文字格式和二進位制格式對「回車」符的寫操作。接下來是對「回車」符的讀操作。

我們用文字檔案和二進位制的形式分別開啟此file.txt,讀取四個位元組。

文字檔案形式

file* fp = fopen("file.txt", "r"); // 文字形式開啟

二進位制檔案形式

file* fp = fopen("file.txt", "rb"); // 二進位制開啟

可以看出,當用文字形式開啟時,遇到換行符時,僅讀到乙個0xa(十六進製制ascii碼,即換行符』\n』);而用二進位制形式開啟時,遇到換行符時,讀到了0xd(十六進製制ascii碼,即回車符』\r』)和0xa,即』\r\n』。

讀寫二進位制檔案時,可以概括為:所寫即所見(寫),所見即所得(讀)

文字檔案更容易讓人理解,二進位制檔案更容易讓機器理解(機器只能夠識別0和1,即二進位制)。

讀寫文字檔案用fprintf和fscanf等,這兩個函式會預設處理的資料都是ascii碼;讀寫二進位制檔案用fwrite和fread。因為fwrite是將資料不經轉換直接以二進位制的形式寫入檔案,而fprintf是將資料轉換為字元後再寫入檔案。以下作簡要描述。

file* fp = fopen("file.txt", "wb");

int num = 12345678;

fwrite(&num, 1, 4, fp);

fputc('\n', fp); //由於二進位制開啟,故為0x0a

上圖中的**和執行後的結果可以看出:

小結:

由於fprintf寫入時,對於整數來說,一位佔乙個位元組,比如1佔1個位元組,12佔2個位元組,123佔3個位元組,12345佔5個位元組,所以檔案的大小會隨資料的大小而改變,對大資料空間占用很大。

而fwrite是按二進位制寫入,所以寫入資料所佔空間是根據資料型別來確定,比如int的大小為4個位元組(一般32位下),那麼整數12所佔空間為4個位元組,123、12345所佔空間也是4個位元組。所以二進位制寫入比格式化寫入更省空間。

fprintf(file *stream, const char *format, ...);
1、stream引數

該引數是乙個 file 物件的指標,指定乙個待操作的資料流。

2、format引數

是乙個格式化字串,由格式化佔位符和普通字元組成。格式化佔位符(以 % 開頭)用於指明輸出的引數值如何格式化。格式化佔位符的語法如下:

%[flags][width][.precision][length]specifier
每乙個格式化佔位符均以 % 開始,以轉換字元結束。

specifier**換字元,必選)的內容及含義如下:參考文章 例

scp選擇二進位制 二進位制傳輸和文字傳輸的區別

ascii方式和binary方式的區別是回車換行的處理 binary方式不對資料執行任何處理 ascii方式將回車換行轉換為本機的回車字元,比如unix下是 n,windows下是 r n,mac下是 r ascii方式下會轉換檔案,不一樣的系統有不一樣的行完畢符,假設你的檔案就是unix下的文字檔...

二進位製流和文字流區別

在c中引入了流 stream 的概念。它將資料的輸入輸出看作是資料的流入和流出,這樣不管是磁碟檔案或者是物理裝置 印表機 顯示器 鍵盤等 都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的物理結構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸出操作物件,抽象化為一種流,而不管它...

二進位製流和文字流區別C

在c中引入了流 stream 的概念。它將資料的輸入輸出看作是資料的流入和流出,這樣不管是磁碟檔案或者是物理裝置 印表機 顯示器 鍵盤等 都可看作一種流的源和目的,視他們為同一種東西,而不管其具體的物理結構,即對他們的操作,就是資料的流入和流出。這種把資料的輸入輸出操作物件,抽象化為一種流,而不管它...