原文地址:http://www.cnblogs.com/dartagnan/archive/2010/12/14/2003499.html linux與windows斷行符號分行符號的區別
問題來源:
“斷行符號”(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
關於斷行符號和換行的曆史。
斷行符號和換行
關於“斷行符號”(carriage return)和“換行”(line feed)這兩個概念的來曆和區別。
在電腦還沒有出現之前,有一種叫做電傳打字機(Teletype Model 33)的玩意,每秒鐘可以打10個字元。但是它有一個問題,就是打完一行換行的時候,要用去0.2秒,正好可以打兩個字元。要是在這0.2秒裡面,又有新的字元傳過來,那麼這個字元將丟失。
於是,研製人員想了個辦法解決這個問題,就是在每行後面加兩個表示結束的字元。一個叫做“斷行符號”,告訴打字機把列印頭定位在左邊界;另一個叫做“換行”,告訴打字機把紙向下移一行。
這就是“換行”和“斷行符號”的來曆,從它們的英語名字上也可以看出一二。
後來,電腦發明了,這兩個概念也就被般到了電腦上。那時,儲存空間很貴,一些科學家認為在每行結尾加兩個字元太浪費了,加一個就可以。於是,就出現了分歧。
Unix系統裡,每行結尾只有“<換行>”,即“\n”;Windows系統裡面,每行結尾是“<換行><回 車>”,即“\n\r”;Mac系統裡,每行結尾是“<斷行符號>”。一個直接後果是,Unix/Mac系統下的檔案在Windows裡打 開的話,所有文字會變成一行;而Windows裡的檔案在Unix/Mac下開啟的話,在每行的結尾可能會多出一個^M符號。
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模式(二進位模式)傳輸文本.