轉自:http://www.cnblogs.com/dartagnan/archive/2010/12/14/2003499.htmlhtml
「回車」(carriage return)VS 「換行」(line feed)
在計算機尚未出現以前,有一種叫作電傳打字機(Teletype Model 33)的玩意,每秒鐘能夠打10個字符。可是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好能夠打兩個字符。要是在這0.2秒裏面,又有新的字符傳過來,那麼這個字符將丟失。
因而,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字符。一個叫作「回車」,告訴打字機把打印頭定位在左邊界;另外一個叫作「換行」,告訴打字機把紙向下移一行。
這就是「換行」和「回車」的來歷,從它們的英語名字上也能夠看出一二。
後來,計算機發明瞭,這兩個概念也就被般到了計算機上。那時,存儲器很貴,一些科學家認爲在每行結尾加兩個字符太浪費了,加一個就能夠。因而,就出現了分歧。
Unix系統裏,每行結尾只有「<換行>」,即「\n」;Windows系統裏面,每行結尾是「<換行><回車>」,即「\n\r」;Mac系統裏,每行結尾是「<回車>」。一個直接後果是,Unix/Mac系統下的文件在Windows裏打開的話,全部文字會變成一行;而Windows裏的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。
c語言編程時(windows系統)
\r 就是return 回到 本行 行首 這就會把這一行之前的輸出 覆蓋掉
如:
int main() {
cout << "hahaha" << "\r" << "xixi" ;
}
最後只顯示 xixi 而 hahaha 背覆蓋了
\n 是回車+換行 把光標 先移到 行首 而後換到下一行 也就是 下一行的行首拉
int main() {
cout << "hahaha" << "\n" << "xixi" ;
}
linux
所謂回車、換行這些控制符,都是從之前的電傳打字機的控制命令繼承下來的。回車就是打印頭復位,換行就是走紙。Dos/Windows和Unix/Linux對回車、換行的理解差異就在於Dos/Windows認爲0d=0d0a=0a,而Unix/Linux堅持沿用電傳打字機的工做方式(這個實際上是比較正確的)。編程
因此在回車換行在Linux中是"0d",在Windows中是"0d0a".咱們能夠經過下面的程序測試一下:windows
上面的紅色字體估計是原做者筆誤,linux的換行符是\n,Ascii碼是0a,而不是0d。至於要測試的話,可使用od -t x1 文件名去查看。app
而\r在linux下的vi看到的是藍色的^M,是使用ctrl+m+v輸出的,能夠在命令模式中使用編輯器
:%s/^M//g刪除,或者使用dos2unix去掉。工具
#define MAX_LENGTH 15536
#include
#include
using namespace std;
string delEnter(const string src) // 過濾掉串中的回車換行符
{
string des;
for(int i = 0; i < src.length(); i++)
{
char tempChar = src[i];
if( tempChar!=10 && tempChar!=13)
des.append(1,tempChar);
}
return des;
}測試
int main()
{
char html[MAX_LENGTH] = "";
FILE *fp = fopen("Linux.txt", "rb"); //FILE *fp = fopen("Windows.txt", "rb");
char buf[16384];
while (fgets(buf, 16384, fp))
strcat(html, buf);
strcat(html,"\0");
string s(html);
cout << "string is: " << s << endl;;
cout << "The size of string is: " << s.length() << endl;
cout << "after del string is: " << delEnter(s) << endl;
cout << "The size of string is: " << delEnter(s).length() << endl;字體
fclose(fp);
return 0;
}spa
程序中文件Linux.txt是從Linux系統中copy過來的。
咱們能夠經過這個程序觀察到,經過過濾掉回車換行符,Linux文件中的字符數的減小等於其行數,而
Windows中等於其行數的兩倍。但有一個問題要注意,程序中行:
FILE *fp = fopen("Linux.txt", "rb");
不能寫成:
FILE *fp = fopen("Linux.txt", "r");
後者默認的文件打開方式是文本方式,這時系統自動對文本進行了轉換,就不能獲得上述的結論。
不過你們能夠在Windows下用工具HexWorkShop,在Linux下用命令hexdump直接觀察具體的二進制代碼,更爲直接。
原文地址:http://noding.bokee.com/3867119.html
關於回車和換行的歷史。
Dos和windows採用回車+換行CR/LF表示下一行,
而UNIX/Linux採用換行符LF表示下一行,
蘋果機(MAC OS系統)則採用回車符CR表示下一行.
CR用符號'\r'表示, 十進制ASCII代碼是13, 十六進制代碼爲0x0D;
LF使用'\n'符號表示, ASCII代碼是10, 十六製爲0x0A. 因此Windows平臺上換行在文本文件中是使用 0d 0a 兩個字節表示, 而UNIX和蘋果平臺上換行則是使用0a或0d一個字節表示.
通常操做系統上的運行庫會自動決定文本文件的換行格式. 如一個程序在windows上運行就生成CR/LF換行格式的文本文件,而在Linux上運行就生成LF格式換行的文本文件. 在一個平臺上使用另外一種換行符的文件文件可能會帶來意想不到的問題, 特別是在編輯程序代碼時. 有時候代碼在編輯器中顯示正常, 但在編輯時卻會由於換行符問題而出錯. 不少文本/代碼編輯器帶有換行符轉換功能, 使用這個功能能夠將文本文件中的換行符在不一樣格式單互換.
在不一樣平臺間使用FTP軟件傳送文件時, 在ascii文本模式傳輸模式下, 一些FTP客戶端程序會自動對換行格式進行轉換. 通過這種傳輸的文件字節數可能會發生變化. 若是你不想ftp修改原文件, 可使用bin模式(二進制模式)傳輸文本.