【转载】 C++中回车换行(\n\r)和换行(\r)的区别
原文:http://blog.csdn.net/xiaofei2010/article/details/8458605
windows下的點一下回車,效果是:回車換行,就是\r\n
unix系統下的回車一下就是一個\n
給出如下代碼:
#include <iostream> using namespace std; int main() { cout << "this is the first line\n"; cout << "this is the second line\r"; cout << "this is the third line\n"; cout << "this is the fouth line\r"; cout << "this is the fifth line\n"; cout << "end" ; return 0; }運行結果如下:
回車換行(\n\r):每次光標移到下一行的行首位置處;
換行(\r):每次光標移到本行的行首位置處。
另見:
?
回車、換行的區別??
他們間的區別其實是個回車換行的問題
先來段歷史
回車”(Carriage Return)和“換行”(Line Feed)這兩個概念的來歷和區別。
符號??????? ASCII碼??????? 意義
\n?????????????? 10?????? ?? 換行
\r??????????????? 13??????????? 回車CR
在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33,Linux/Unix下的tty概念也來自于此)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。
于是,研制人員想了個辦法解決這個問題,就是在每行后面加兩個表示結束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。
后來,計算機發明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。于是,就出現了分歧。
在Windows中:
'\r' 回車,回到當前行的行首,而不會換到下一行,如果接著輸出的話,本行以前的內容會被逐一覆蓋;
'\n' 換行,換到當前位置的下一行,而不會回到行首;
Unix系統里,每行結尾只有“<換行>”,即"\n";Windows系統里面,每行結尾是“<回車><換行>”,即“\r\n”;Mac系統里,每行結尾是“<回車>”,即"\r";。一個直接后果是,Unix/Mac系統下的文件在Windows里打開的話,所有文字會變成一行;而Windows里的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。
例:
$ echo -en '12\n34\r56\n\r78\r\n' > tmp.txt
分別在Windws和Linux中查看此文件可知: Linux中遇到換行符("\n")會進行回車+換行的操作,回車符反而只會作為控制字符("^M")顯示,不發生回車的操作。而windows中要回車符+換行符("\r\n")才會回車+換行,缺少一個控制符或者順序不對都不能正確的另起一行。?
另見:
回車的傳說---兼談\n\r區別(轉載)
如果你有在windows下編程的經驗就會發現windows下敲下回車鍵會產生兩個字符CR和LF,用16進制編輯器打開windows下的文本文件也會看到換行是0D和0A表示的,也就是CR和LF的ASCII編碼。而在UNIX類系統中換行只有一個字符LF,所以UNIX中的文本文件在windows中用記事本打開會出現不可解析字符且丟失換行格式,所有字符連成一行。
??? 因為windows下的記事本讀到LF時不知道這就是換行(只有CR和LF連續出現才能解釋為換行),于是當作不可打印字符處理,就是一個黑色方框。CR和LF分別表示“回車”(carriage return)和“換行”(line feed),ASCII編碼為13和10,在C語言中用\r和\n表示。
??? 為什么windows下要用兩個字符表示換行?這就是今天要講的故事:《回車的傳說》
??? 在計算機剛剛誕生之時,廣泛使用Teletype公司制造的一種古老的終端(console terminal)電傳打字機ASR33。ASR33每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,打印頭從行尾移到行首再下移一行要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失,那時可沒有緩沖區暫存。Teletype的研究人員想了個辦法解決這個問題,就是在每行后面加兩個表示結束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。
下面是一些參考資料:
History of The Teletype Corporation
http://www.kekatos.com/teletype/
The Teletype Corporation ASR 33 Teletype (1967).
?
( 1968年蓋茨在湖濱中學玩的就是這種機器,他們通過這種終端編寫BASIC程序。因為 ASR 33只使用大寫字母,所以BASIC程序以大寫字母為主)
??? 后來,計算機的史前時代結束了,小型機誕生了,現代文明的鍵盤也發明了,但回車和換行的概念仍被保留下來。一些計算機設計者認為在每行結尾加兩個字符太浪費也沒有必要了,加一個就可以。于是就出現了分歧。
??? Unix系統里使用<line feed>表示換行,每行結尾只有一個換行符\n,MSDOS和Windows系統里面每行結尾是<回車><換行>(<carriage return><line feed>)即\r\n,Apple的Mac系統里每行結尾是<回車>(<carriage return>)即\r。一個直接后果是,Unix/Mac系統下的文件在Windows里打開的話,所有文字會變成一行;而Windows里的文件在Unix/Mac下打開的話,某些文本編輯器可能在每行的結尾會多出一個^M符號。
?? 本人覺得用兩個字符表示換行實在有些畫蛇添足,但是在網絡的世界里這一現象卻大量存在,不少網絡協議規定報文必須使用CR-LF換行模式。
你怎么看呢?前不久在CU的論壇對這一問題進行了討論:http://bbs2.chinaunix.net/thread-1067432-1-1.html
這個和編程有關系嗎?
有的,但是在標準C里通常情況下是體會不到的,標準C的流提供系統無關抽象層。
可以在windows系統中進行一下實驗:
????
程序一:
----------------------------------------------
?
#include <stdio.h> int main(void) { int i; FILE *fp; if((fp=fopen("test.txt","w")) == NULL) { fprintf(stderr,"open file error\n"); return 1; } for(i=0;i<100;i++) fprintf(fp,"test\n"); fclose(fp); return 0; }?
程序二:
-------------------------------------------------------------------------------------
?
[cpp]?view plaincopyprint? #include <stdio.h> int main(void) { int i; FILE *fp; if((fp=fopen("test.bin","wb")) == NULL) { fprintf(stderr,"open file error\n"); return 1; } for(i=0;i<100;i++) fprintf(fp,"test\n"); fclose(fp); return 0; }--------------------------------------------------------------------------------------
程序一輸出文件大小是600字節,程序二輸出文件大小是500字節,用記事本打開程序一的輸出沒有什么問題,每行一個test,打開程序二的輸出發現所有的test連成一行,test之間是一個黑色方框符號分隔。用UltraEdit-32以16進制編輯模式打開test.bin可以查看到黑色方框符號就是0A也就是\n,打開test.txt則會發現換行是\r\n,這就是兩個文件大小相差100字節的原因。Unix類系統用戶打開windows中的文件就會遇到這種苦惱。
為什么會有這種區別呢?
??? 畢竟是源自Unix系統,C語言中使用\n表示換行,而在實際的文件中換行符號需要同操作系統一致,所以當我們在C中使用fopen打開一個文本文件時流實現了實際換行符與C中\n之間的轉換。在windows中當我們用fopen打開文本文件,然后從中讀到\r\n時流會轉換為\n,而當我們往文件中寫入\n時流會轉換為\r\n。程序一是打開文本文件,程序二打開的是二進制文件,因為流只對文本文件進行換行表示的轉換,以二進制模式打開流不會做任何處理。所以當你以二進制模式打開一個文本文件時將產生錯亂,你必須親自將\r\n解釋為\n,同樣的問題也會出現在以文本模式打開二進制文件的情況.這也解釋了為什么Unix類系統中的文件不區分文本文件和二進制文件的原因。
??
當我們使用標準輸入輸出函數時有這種情況嗎???
再回到我們熟悉的標準輸入輸出stdin,stdout
??? C的控制臺程序在加載進內存成為進程運行前C運行時庫自動打開三個設備并關聯到三個流:標準輸入流stdin,標準輸出流stdout,標準出錯流stderr
??? 通常在通用計算機中,沒有重定向前這三個流對應的設備是:鍵盤,顯示器,顯示器。這三個都是字符設備,所以是以文本文件的模式打開的,在windows下當我們在鍵盤上敲入回車鍵時產生字符\r\n,但是在OS內核把鍵盤驅動中讀到的字符發送給流的緩沖區時流會將之轉換為\n,當我們向控制臺輸出\n時流將之轉換為\r\n再傳遞至內核,當我們繞過標準輸入輸出直接調用windows中coredll.lib進行控制臺輸入輸出時就必須面對這一現實,程序員負責實現這一轉換。
?
——————————————————————————————————————————————————————
其他解釋:/r 回車符 /n 換行符 其中 /r的碼值是13 ,
謝謝^_^詳細的看看下面的說明:MS-DOS文本文件用回車符和換行符的組合\r\n表示行尾。Macintosh文本文件使用只用一個回車符\r來表示行尾。C程序使用\n表示行尾。所以,在C程序以文本方式打開一個MS-DOS文本文件時,會將\r\n轉換為\n,在寫入文件的時候它會將\n轉換為\r\n。(如果以二進制方式打開該文件,則C程序將看到\r和\n兩個字符。)而對于Macintosh文本文件的文本視圖,在讀取文件時它會將\r轉換為\n,在寫入文件的時候它會將\n轉換為\r \n是換行符,但不會刷新緩沖區
endl在輸出一個換行符后,立即刷新緩沖區,這樣不管緩沖區有沒有被寫滿,數據都直接發送到輸出設備
c語言 - 回車符和換行符
Unix 系統里,每行結尾只有“<換行>”,即“\n”;Windows系統里面,每行結尾是“<換行><回車>”,即“\n\r”;Mac系統里,每行結尾是“<回車>”。一個直接后果是,Unix/Mac系統下的文件在Windows里打開的話,所有文字會變成一行;而Windows里的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。
在Windows環境中,如果輸入到文本文件,程序中的一個'\n'換行符被解釋成'\r'、'\n'兩個字符(會車、換行);相反,如果讀取文本文件,文件中的相鄰的兩個'\r'、'\n'會合并為一個'\n'輸出。但是在Unix/Linux環境下,'\n'就是'\n',保持不變。???
因此,Windows下的文本文件和Unix/Linux下的文本文件的格式是不同的,其原因就在于對于程序中的'\n'換行符的解釋不同。'\n',(換行符)是換行走紙,沒有回車,回車是由'\r'實現 。 ?在UNIX中,早期的輸入通常是穿孔機,沒有什么回車概念。在DOS中,由于是屏幕輸入,通常就有了'\r''\n'的區別,為了保證每次換行都能從頭開始,DOS中的換行符通常會被存儲為'\r\n'。
\r與\n的區別,\r\n與\n或\r的區別(C語言/C#)
本文出處http://topic.csdn.net/t/20020718/07/882679.html? 原作者:triout(笨牛)
\r表示回車,\n表示換行,我們按回車按鈕的時候,系統自動產生回車和換行兩個字符:???
? 回車僅僅是表示完成,把光標回到行首,???
? 換行僅僅是換行,不表示完成,也不把光標放到行首。???
? 示例:(下面用I表示光標)???
? 1——???
? 輸出abcdef后:???
? abcdefI???
? 2——???
? 輸出回車后:???
??Iabcdef???
? 2——‘???
? 如果是輸出換行:???
? abcdef???
??????????????I???
? 3——???
? 輸出回車和換行:???
? abcdef???
??I???
? 可用C語言來測試回車與換行的區別:假設當前光標的位置是5行10列,輸出回車后,光標位置變為5行1列,如果輸出的是換行則是6行10列,如果輸出回車和換行則是6行1列。???
? 如果你要想輸出\r或\n這樣的內容,你需要使用這樣的方法:???
? Console.Write("\\r\\n");???
? 或???
? Console.Write(@"\r\n");???
? 輸入回車后,產生的兩個字符回車和換行
?
C語言中換行符和回車符的區別(轉)
換行(\n)將當前位置移動到下一行開頭。
回車(\r)將當前位置移動到本行開頭。
退格(\b)將當前位置移動到錢一列。
Enter鍵按下后會執行\n\r這樣就是我們看到的一般意義的回車了,所以你用16進制文件查看方式看一個文本,就會在行尾發現"\n\r"Tab是制表符,就是"\t",作用是預留8個?字符的顯示寬度,用于對齊。?
----------------------------------------------------------------------------------
在計算機還沒有出現之前,有一種叫做電傳打字機(Teletype?Model?33)的玩意,每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字符。要是在這0.2秒里面,又有新的字符傳過來,那么這個字符將丟失。于是,研制人?
員想了個辦法解決這個問題,就是在每行后面加兩個表示結束的字符。一個叫做“回車”,告訴打字機把打印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。這就是“換行”和“回車”的來歷,從它們的英語名字上也可以看出一二。后來,計算機發明了,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認為在每行結尾加兩個字符太浪費了,加一個就可以。于是,就出現了?分歧。??
Unix系統里,每行結尾只有“<換行>”,即“\n”;Windows系統里面,每行結尾是“<換行><回車>”,即“\n\r”;Mac系統里,每行結尾是“<回車>”。一個直接后果是,Unix/Mac系統下的文件在Windows里打開的話,所有文字會變成一行;而Windows里的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。??
?
在ascii中,回車和換行是不同的字符。0x0A是回車,即光標移動到本行的最左面;?0x0D是換行,即光標移動到下一行。??
??
在dos窗口中按回車鍵,其實是輸入了兩個字符0x0A,0x0D,對應到c中,就是\r(回車)\n(換行)???
在C語言中??
將?\n?存入文件??window:?0d?0a??
?
?
unix:?0d??
如果不存到文件中,不會變。??如果從文件中提取,??windows:?0d?0a?->?\n??unix?:?0d?->?\n?
回車鍵,即鍵盤上的ENTER鍵,是一個比較有用的鍵,在文字編輯時,回車鍵的作用是換行,在輸入網址時回車鍵的作用是“轉到”,在執行DOS命令時,回車鍵的作用是執行????
在標準鍵盤上,回車鍵一共有2個,一個在主鍵盤區的右邊,Shift鍵的上面,一個在小鍵盤的右下角,加號鍵的下面。???
回車鍵的歷史???
關于“回車鍵”的來歷,還得從機械的英文打字機說起。在打字機上,有一個部件叫“字車”,每輸入一個單詞,“字車”就前進一格。當輸滿一行后,使用者就要推動“字車”到起始位置,這時打字機會有兩個動作:“字車”歸位、滾筒上卷一行(相當于“字車”下移一行),以便開始輸入下一行,這中推動“字車”的動作叫“回車”。后來,在電動的打字機上,人們增加了一個直接起“回車”作用的鍵。他被稱為“回車鍵”。??
??在現今的電腦鍵盤上,“回車鍵”上曾使用過“CR”、“RETURN”的字樣,后來才統一確定為“Enter”。???
回車的ASCII代碼???
16進制是“0x0d”??10進制是“13”??
在某些語言中可以用‘\r’表示。?
如果用過機械打字機,就知道回車和換行的區別了。。。??換行就是把滾筒卷一格,不改變水平位置。??回車就是把水平位置復位,不卷動滾筒。????
但是我們平時按得Enter到底是回車還是換行,不太清楚????
看到一種說法:windows下enter是?\n\r,unix下是\n,mac下是\r???
在MS的系統中純文本格式按一個回車鍵是輸入了兩個字符,一個回車一個換行。在LINUX系統中則只是一個回車。??
//以上內容參考了http://topic.csdn.net/t/20040617/23/3101951.html#和http://topic.csdn.net/t/20021113/09/1171659.html的討論???
還有在編程時文件操作???
?
?
wb(二進制方式)或者wt(文本方式)也會有影響。我做了個實驗(實驗用.net2003)??在01.txt文件中輸入12然后enter,在ultraedit中看到的二進制是31?32?0d?0a???
然后程序如下:???
int?mian()??
{?FILE?*fp1,*fp2,*fp3,*fp4,*fp5,*fp6;???
char?a[10];??char?b[10];???
fp1?=?fopen("01.txt","r");??fp3?=?fopen("02.txt","w");??
fread(a,sizeof(unsigned?char),8,fp1);?//a里是31?32?0a??
fwrite(a,sizeof(unsigned?char),8,fp3);?//02.txt里是31?32?0d?0a?,原因是輸入的情況下,換行回車轉換成換行,然后輸出時換行又會?
轉成換行回車??fclose(fp1);??fclose(fp3);???
fp2?=?fopen("01.txt","rb");??fp4?=?fopen("03.txt","wb");??
fread(b,sizeof(unsigned?char),8,fp2);?//b里是31?32?0d?0a??
fwrite(b,sizeof(unsigned?char),8,fp4);?//03.txt里是31?32?0d?0a?,原因是二進制情況下回車和換行的(類似文本方式的那種轉換)是不存在的??fclose(fp2);??fclose(fp4);???
return?0;??}??
好像結論是這樣的:讀的方式下,在文本方式下,enter是0x0a;在二進制方式下,enter是0x0d,0x0a。???
MSDN中查到這樣的話:Also,?in?text?mode,?carriage?return–linefeed?combinations?are?translated?into?single?linefeeds?on?input,?and?linefeed?characters?are?translated?to?carriage?return–linefeed?combinations?on?output.?(輸入的情況下,換行回車轉換成換行,然后輸出時換行又會轉成換行回車)When?a?Unicode?stream-I/O?function?operates?in?text?mode?(the?default),?the?source?or?destination?stream?is?assumed?to?be?a?sequence?of?multibyte?characters.?Therefore,?the?Unicode?stream-input?functions?convert?multibyte?characters?to?wide?characters.?For?the?same?reason,?the?Unicode?stream-output?functions?convert?wide?characters?to?multibyte?
?
?
characters.???
Open?in?binary?(untranslated)?mode;?translations?involving?
carriage-return?and?linefeed?characters?are?suppressed.?(二進制情況下回車和換行的轉換是不存在的).???
再引用一篇:http://zhidao.baidu.com/question/27868102.html?fr=qrl3???
軟硬回車?}???
硬回車就是普通我們按回車產生的,它在換行的同時也起著段落分隔的作用。??軟回車是用?Shift?+?Enter?產生的,它換行,但是并不換段,即前后兩段文字在?Word?中屬于同一“段”。在應用格式時你會體會到這一點。????
切換:???
編輯——替換,點擊高級,在“查找內容”點入“特殊字符”中的手動換行符,再在“替換為”中點入“特殊字符”中的段落標記,最后點擊全部替換。??????
鍵盤上只有一種回車鍵Enter,但卻有兩種不同性質的換行標記,不能不說是一個奇跡。???
我們常用的回車是硬回車,就是在word中敲擊Enter鍵產生的那個彎曲的小箭頭,占兩個字節。這種回車可以有效地把段落標記出來分清楚。在兩個硬回車之間的文字自成一個段落,可以對它單獨設置段落標記而不用擔心其他段落受到影響。這也是我們習慣用硬回車的原因:排版方便。???
但是硬回車也給我們帶來了麻煩。你如果是網頁設計者,或者是論壇游俠,一定有這樣的經歷:當你打算換行時,換出的行卻實在不能恭維,行間距太大了!其實這和硬回車的原理是一樣的,只不過在word等文本編輯器中沒有顯示出它的“本來面目”。不過這樣的排版的確造成了不小的困難,這時我們就得請出硬回車的兄弟:軟回車。???
軟回車只占一個字節,在word中是一個向下的箭頭。如果你從很復雜的網頁中向word中復制過文字的話,對它一定不會陌生。但是想在word中直接輸入軟回車可不是那么容易的。因為軟回車不是真正的段落標記,它只是另起了一行,不是分段。所以它不是很利于文字排版,因為它無法作為單獨的一段被賦予特殊的格式。但是盡管如此,它在網頁設計中還是具有舉足輕重的地位的。???
軟回車能使前后兩行的行間距大幅度縮小,因為它不是段落標記,要和法定的段
?
?
落標記——硬回車區別出來。硬回車的html代碼是<p>..</p>,段落的內容就夾在里面,而軟回車的代碼很精悍:<br>。因此在網頁中想用到軟回車,只需切換到代碼頁面,鍵入軟回車的代碼即可。??
下面我講一下不同編輯器文字互相拷貝時回車的轉化情況。???
地球人都知道的,網頁的文字如果復制到word中,則硬回車變為彎曲的箭頭,軟回車變為向下的箭頭。結果造成習慣用word編輯文本的朋友很不習慣很不舒服的情況。???
word中的文本復制到網頁中也是同樣的道理。可以說word和網頁比較兼容的,要不怎么會有“保存為web頁”這種選項呢????
記事本也是大家摸的比較多的編輯器。但是近年來隨著社會發展外加記事本的種種弊端,許多人都將其打入冷宮。對此我只能表示遺憾,因為記事本本身的功能不豐富就是別的編輯器所取代不了的優點。大家再次將網頁的文字復制時,不妨粘貼到記事本里試試。哈哈,不管網頁設計者用的是什么回車,現在都變成一種回車了!怎么,你不信?那就看看吧:軟回車變成了普通的回車,硬回車變成了兩個普通的回車。你再從記事本里復制文字到word,記事本里的回車無一例外全都變成了硬回車!你再再從記事本里復制文字到網頁編輯器,所有回車就都變成軟回車了!!?
\n是換行,英文是linefeed,ASCII碼是0xA。??
\r是回車,英文是carriage?return?,ASCII碼是0xD。?
---------------------------------------------------------------------------------------------------------------------------?回車的傳說---兼談\n\r區別(轉載)?
IT文摘2010-08-31?11:40:24閱讀86評論0?字號:中訂閱?
如果你有在windows下編程的經驗就會發現windows下敲下回車鍵會產生兩個字符CR和LF,用16進制編輯器打開windows下的文本文件也會看到換行是0D和0A表示的,也就是CR和LF的ASCII編碼。而在UNIX類系統中換行只有一個字符LF,所以UNIX中的文本文件在windows中用記事本打開會出現不可解析字符且丟失換行格式,所有字符連成一行。?
因為windows下的記事本讀到LF時不知道這就是換行(只有CR和LF連續出現才能解釋為換行),于是當作不可打印字符處理,就是一個黑色方框。CR和LF分別表示“回車”(carriage?return)和“換行”(line?feed),ASCII編碼為13和10,在C語言中用\r和\n表示。?
為什么windows下要用兩個字符表示換行?這就是今天要講的故事:《回車的傳說》?
在計算機剛剛誕生之時,廣泛使用Teletype公司制造的一種古老的終端(console?terminal)電傳打字機ASR33。ASR33每秒鐘可以打10個字符。但是它有一個問題,就是打完一行換行的時候,打印頭從行尾移到行首再下移一行要
?
轉載于:https://www.cnblogs.com/jexwn/p/4573072.html
總結
以上是生活随笔為你收集整理的【转载】 C++中回车换行(\n\r)和换行(\r)的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧几里德算法与扩展欧几里德算法
- 下一篇: C++中随机函数rand()和srand