換行符到底是個神馬東西?換行符詳解

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

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

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

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

Unix系統裏,每行結尾只有“ <換行> ”,即“\n”;Windows系統裏面,每行結尾是“ <換行> <回車> ”,即“\n\r”;Mac系統裏,每行結尾是“ <回車> ”。一個直接後果是,Unix/Mac系統下的文件在Windows裏打開的話,所有文字會變成一行;而Windows裏的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號。

google找到了這麼一段信息:

換行符就是另起一行, 回車符就是回到一行的開頭,所以我們平時編寫文件的回車符應該確切來說叫做回車換行符  

'\n' 10 換行(newline)
'\r' 13 回車(return)

在windows系統下,回車換行符號 是"\r\n". 但是在Linux等系統下是沒有"\r"符號的。

在解析文本或其他格式的文件內容時,常常要碰到判定回車換行的地方, 這個時候就要注意既要判定"\r\n"又要判定"\n"。

 

現在還是對它很模糊的概念, 那麼我們寫個測試的代碼吧!

 

bool checkLineSymbol() {
char *fileStr;
Int32 length = 0;
Int32 i =0;
Int32 number = 0;
fileStr = loadPolicyFile();
if(fileStr == NULL) {
return false;
}

length = cStrlen(fileStr);
cTrace("file char length: \n");
cTrace("%d\n", length);

for(i = 0; i < length; i++) {
number = (Int32)(*(fileStr + i));
cTrace("number: %d\n", number );
}

cTrace("test checkLineSymbol is end!\n");

}

 

       代碼看不懂沒有關係, 上面的代碼主要功能是從一個txt文件中輸出每個字符的數字。我的這個文本文件中主要是寫入了“\n”兩個字符,同時進行了一個回車的操作。我想看一下輸 出的結果是什麼。最後輸出的結果,顯示有4個字符, 分別是92, 110,13, 10。也就是說我只是寫入了2個字符,但是通過文件操作函數的read,它給我讀出了4個字符。那麼這三個數字分別代表什麼呢。

 

        我去查了一下assII碼錶,92 爲‘\’, 110爲 'n', 13與10是控制符號,分別是'cr','nl'。說明了當我們在編輯文本文件(nodepad)的時候。每次調入一個回車鍵的時候,nodepad編輯 器自動給我們加了13,10兩個控制符號。

 

       後來我又使用了vim文本編輯器進行相同的編輯,輸出的結果爲92, 110, 10三個字符。說明vim編輯器裏面,敲入一個回車鍵, 該編輯器只是給我們添加了一個10控制符號來表示換行。

 

       這裏我引出一個話題, 那就是notepad編輯器爲什麼在敲入回車鍵的時候,微軟工程師們要加入一個\r呢。而vim也就是Linux幫派不加入這個控制符號呢? 這裏面有什麼貓膩, 就由讀者你自己去研究了。我就不管這些東東了。等你研究出來我google羅。哈哈

 

C代碼
  1. bool checkLineNumber() {  
  2.     char nL = '\n';  
  3.     char rL = '\r';  
  4.     Int32 number = 0;  
  5.   
  6.     number = (Int32)nL;  
  7.     cTrace("\\n in code number is: \n");  
  8.     cTrace("%d\n", number);  
  9.   
  10.     number = (Int32)rL;  
  11.     cTrace("\\n in code number is: \n");  
  12.     cTrace("%d\n", number);  
  13.   
  14.     cTrace("test checkLineNumber is end");  
  15. }  
bool checkLineNumber() { 	char nL = '\n'; 	char rL = '\r'; 	Int32 number = 0;  	number = (Int32)nL; 	cTrace("\\n in code number is: \n"); 	cTrace("%d\n", number);  	number = (Int32)rL; 	cTrace("\\n in code number is: \n"); 	cTrace("%d\n", number);  	cTrace("test checkLineNumber is end"); }  

 

      上面這段代碼,主要是說明一下,我們在編寫代碼中。有一個叫字符轉義符號的問題。通常我們在解析文件中的數據的時候,都要判斷文件是否需要換行。這樣我們 就知道那裏是換行,那裏不換行了。以爲我們以後的邏輯處理。

      

       那麼爲什麼要引入字符轉義符號呢?個人覺得主要是爲了方便記憶吧。'\r',代表回車符號。 '\n'代表換行,外文也就是newLine,老外搞的一套東東。代碼在進行編譯的時候,編譯器會做處理,把'\r'轉成13。

      

       其實我們完全可以寫成char nL = 13;來代表這個字符是回車符號。但是char nL = '\r'比較直觀。這裏我做一個猜測:在編譯C階段,char nL = 13;這段代碼行可能比char nL = '\r'快。因爲編譯器要對後一個代碼做一些額外的處理。當然這是沒有必要的,因爲畢竟這些消耗是可以忽略不記的,相對現在的計算機處理速度。

      

       好了,現在說說我上面代碼的功能吧,主要是看看'\r'與'\n'分別是什麼值。輸出的結果是'\r'爲轉義成了13, '\n'被轉義成了10.

 

       now,分析完畢!大致有了個瞭解了, 我要開始寫代碼了。呵呵,你懂了麼?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章