詳解文字讀寫時主流作業系統平台換行符和回車符差異

2021-09-02 08:04:28 字數 3531 閱讀 4080

1  字元定義

ascii碼  符號  字元縮寫(全稱)                中文名稱

13          \r       cr (carriage return)             回車

10          \n      lf (nl line feed, new line)    換行

cr:本義是游標定位到行首(本行),即carriage return,\r,n表示return

假設定義

對於windows/unix/linux等主流作業系統,在文字讀寫時,鍵盤的回車鍵(enter鍵)等同於:換行+回車。

2 差異測試

文字讀寫時,\r和\n在各主流作業系統的差異:

windows系統: \r\n表示換行+回車

例1:

假如通過程式向檔案test.txt從首行寫入字串行:\naaa\r\nbb\nb\rccc

那麼,通過程式按字元的ascii碼讀取文字內容的結果:1097979713109898109813999999

使用記事本開啟test.txt,文字內容如下:

aaabbbccc(此處為游標終點位置)

可見,windows系統\r\n表示回車+換行,單獨的\r或\n在記事本中的顯示為不佔位的空字串,不會控制游標的移動。

例2:假如通過程式向檔案test.txt從首行寫入字串行:\naaa\r\nbb\nb\rccc\r

那麼,通過程式按字元的ascii碼讀取文字內容的結果:109797971310989810981399999913

使用記事本開啟test.txt,文字內容如下:

aaabbbccc(此處為游標終點位置)

可見,\r始終顯示為不佔位的空字串,無論是在文字的末尾或中間。

例3:假如通過程式向檔案test.txt從首行寫入字串行:\naaa\r\nbb\nb\rccc\n

那麼,通過程式按字元的ascii碼讀取文字內容的結果:109797971310989810981399999910

使用記事本開啟test.txt,文字內容如下:

aaabbbccc

(此處為游標終點位置)

可見,對於win的記事本,當\n在文字末尾時,游標跳到了下一行行首(回車+換行),而文字中間的\n不會。

總結

a.windows平台,\r\n表示換行+回車

b.單獨\r僅表示不佔位的ascii字元(空字元),不控制游標的移動;

c.單獨\n僅表示不佔位的ascii字元(空字元),不控制游標的移動;

但當\n位於文字內容的末尾時,對於win的記事本,游標會跳到下一行行首,否則\n不控制游標的移動,求大神解釋原因!

unix和linux系統:  \n表示換行+回車

例1:

假如通過程式向檔案test從首行寫入字串行:aaa\n\rbbb\rccc

那麼,通過程式按字元的ascii碼讀取文字內容的結果:979797101398989813999999

[root@localhost opt]vi test

aaa^mbbb^mccc ~

[root@localhost opt]cat test

aaaccc[root@localhost opt]# 

可見,\n代表回車+換行,\r在linux文字編輯器顯示為^m,\r在linux檔案讀取命令cat控制游標移到到本行行首(本義)

例2:假如在例1字串行後追加乙個\n

通過程式向檔案test從首行寫入字串行:aaa\n\rbbb\rccc\n

那麼,通過程式按字元ascii碼讀取文字內容的結果:97979710139898981399999910

[root@localhost opt]vi test

aaa^mbbb^mccc ~

說明:對於vi,\n也是換行+回車, 但在字串行末尾為時,因vi游標顯示問題,效果不明顯,導致看似和例1一樣

[root@localhost opt]cat test

aaaccc

[root@localhost opt]# 

例3:假如在例2字串行後再追加乙個\n

通過程式向檔案test從首行寫入字串行:aaa\n\rbbb\rccc\n\n

那麼,通過程式按字元ascii碼讀取文字內容的結果:9797971013989898139999991010

[root@localhost opt]vi test

aaa^mbbb^mccc

~[root@localhost opt]# cat test 

aaaccc

[root@localhost opt]# 

總結

a.linux系統中,\n表示換行+回車

b.對於linux的文字編輯器vi,\r顯示為^m

c.對於linux的文字讀取和顯示命令cat,\r控制游標移動到行首(較好地詮釋了\r的意義)

mac:  \r表示換行+回車

mac系統沒有做相關測試,有興趣的可以自己測試。

3 字元歷史(引用)

在計算機還沒有出現之前,有一種叫做電傳打字機(teletype model 33)的玩意,每秒鐘可以打10個字元。但是它有乙個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。

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

這就是「換行」和「回車」的來歷,從它們的英語名字上也可以看出一二。

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

/************************************===*/

\n:  unix 系統行末結束符

\r\n: window 系統行末結束符

\r:  mac os 系統行末結束符

/************************************===*/

乙個直接後果是,unix/mac系統下的檔案在windows裡開啟的話,所有文字會變成一行;而windows裡的檔案在unix/mac下開啟的話,在每行的結尾可能會多出乙個^m符號。(這也是經常說見到的現象,哈哈,原來是這樣的)

c++語言程式設計時(windows系統)\r 就是return 回到 本行 行首 這就會把這一行以前的輸出 覆蓋掉

如:int main()

最後只顯示 xixi 而 hahaha 被覆蓋了

\n 是回車+換行 把游標 先移到 行首 然後換到下一行 也就是 下一行的行首拉

int main()

則 顯示

hahaha

xixi

c 文字讀寫操作詳解

引用標頭檔案 fstream 建立流物件 指定檔案及開啟方式 讀寫資料 關閉檔案 ofstream 寫操作 從記憶體向檔案中輸出資料 ifstream 讀操作 從檔案中向記憶體中輸入資料 fstream 讀寫操作 開啟方式 ios in 為讀檔案而開啟檔案 ios out 為寫檔案而開啟檔案 ios...

parc作業系統 世界6大主流作業系統回顧

前言 眾所周知,電腦都是由硬體和軟體組成的,缺了任何一樣電腦都是沒有辦法執行的。在我們使用電腦的過程中,一切的操作都是利用作業系統來完成。最早的計算機其實並沒有作業系統,在那個時候人們想要操作計算機只能通過各種 不同的操作按鈕來控制計算機,然後隨著計算機技術的不斷發展隨後就出現了彙編語 言,並將它的...

實時作業系統主流排程方法RMS

作業系統的排程方法有很多種,這裡主要介紹主流的排程演算法,像edf這種排程演算法就不表述了。目前幾乎所有的商業實時作業系統的排程理論都基於rms理論.以下是基於rms的一些假設理論 1 各個任務之間沒有資源共享,沒有忙等,沒有mutex,也沒有semaphore.2 每個任務的最後期限是週期性的。3...