轉自:http://www.cnblogs.com/dartagnan/archive/2010/12/14/2003499.html
“回車”(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" ;
}
所謂回車、換行這些控制符,都是從以前的電傳打字機的控制命令繼承下來的。回車就是打印頭復位,換行就是走紙。Dos/Windows和Unix/Linux對回車、換行的理解差別就在於Dos/Windows認為0d=0d0a=0a,而Unix/Linux堅持沿用電傳打字機的工作方式(這個其實是比較正確的)。
所以在回車換行在Linux中是"0d",在Windows中是"0d0a".我們可以通過下面的程序測試一下:
上面的紅色字體估計是原作者筆誤,linux的換行符是\n,Ascii碼是0a,而不是0d。至於要測試的話,可以使用od -t x1 文件名去查看。
而\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;
}
程序中文件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模式(二進制模式)傳輸文本.