換行符 n和回車符 r

2022-05-24 06:12:08 字數 1488 閱讀 4339

問題始於社群的乙個帖子,樓主的問題如下:

「在c語言中,對乙個不知道大小的檔案進行讀操作,我用fread()將檔案的內容先放到乙個快取區,然後將快取區中的內容列印出來,

快取區中的內容和檔案中的內容不一樣,好像是因為快取區的空間比儲存檔案內容所需要的空間大了,不知道應該怎麼解決」

這個問題我之前也碰到過,翻了一些c語言檔案操作方面的資料,發現對於換行的處理,其實是乙個從打字機時代就有的歷史遺留問題:

「在計算機還沒有出現之前,有一種叫做電傳打字機(teletype model 33)的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打

完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。 於是,研製人員

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

告訴打字機把紙向下移一行。 」

在計算機出現之後,這種概念又被移植到了計算機作業系統上。當然,對於是否移植這一點也是有爭議的,windows和unix/mac系統在這一點

上就分道揚鑣了。

下面首先討論在windows平台下的情況。

windows平台採用了歷史的概念,在檔案中,換行被處理為「\r\n」兩個字元,也就是說,雖然使用者只敲了一次回車鍵,但其實系統

會認為收到了「\r\n」兩個字元,並同時儲存了這兩個字元。

因此,在windows平台下,檔案為了儲存一次換行會寫入兩個字元。當程式設計師試圖從檔案中讀取檔案內容時,c語言提供了兩種方式:文字方

式和二進位制方式,這兩種方式又有什麼區別呢?

在windows平台下,採用文字方式開啟乙個檔案時,會自動將一次換行,即「\r\n」兩個字元轉換成乙個「\n」字元,即會去掉乙個「\r」

字元,這種轉換的結果就是:實際讀取的資料長度會比檔案的真實長度短,兩者之差等於檔案中的換行次數。而當採用二進位制方式開啟

乙個檔案時,由於二進位制方式開啟的特點是有什麼讀什麼,因此,「\r\n」兩個字元會原封不動,均被讀取,因而實際讀取的資料長度與

原檔案長度相同。

由於這種區別的存在,推薦大家在讀取檔案時採用二進位制方式,檔案中是什麼內容,讀取到的就是什麼內容。

那麼,在unix平台下呢?

unix/mac平台並沒有採用windows平台的方式,在unix/mac中,每一行的結尾只有乙個換行符,即「\n」,因此,unix/mac平台下兩種讀取方式

是不會有區別的。

乙個直接後果是,unix/mac系統下的檔案在windows裡開啟的話,所有文字會變成一行;而windows裡的檔案在unix/mac下開啟的話,

某些文字編輯器可能在每行的結尾會多出乙個^m符號。

換行符 n 和回車符 r

換行符 n 和回車符 r 顧名思義,換行符就是另起一行,回車符就是回到一行的開頭,所以我們平時編寫檔案的回車符應該確切來說叫做回車換行符 n 10 換行 newline r 13 回車 return 也可以表示為 x0a 和 x0d 16進製制 在windows系統下,回車換行符號是 r n 但是在...

換行符 n 和回車符 r

換行符 n 和回車符 r 顧名思義,換行符就是另起一行,回車符就是回到一行的開頭,所以我們平時編寫檔案的回車符應該確切來說叫做回車換行符 n 10 換行 newline r 13 回車 return 也可以表示為 x0a 和 x0d 16進製制 在windows系統下,回車換行符號是 r n 但是在...

關於換行符 n和回車符 r

首先介紹一下 回車 carriage return,r 和 換行 line feed,n 這兩個概念的來歷和區別。在計算機還沒有出現之前,有一種叫做電傳打字機 teletype model 33 的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個...