windows下操做文件換行符的問題

 爲何寫這篇文章?

    由於在工做過程當中, 常常會切換Linux 和Windows, 操做文檔時有兩次遇到莫名的問題, 怎麼查程序都查不出來, 由於邏輯都沒問題,可是數據就是出錯了。查了N天,發現是不一樣操做系統換行符的問題,搞得血都吐了一堆。而網上不少文章感受都沒有講的很清晰。html

 爲了避免讓你們重蹈覆轍,參考了其餘網站的文章,特意總結了一下, 但願能在一篇文章裏把問題講解清楚。java

    固然,若是其中理解有誤的地方,請各位提出來。原本想分析一下源碼,可是沒有找到相關windows下轉換的源碼,就暫時不剖析了。若是各們有找到源碼的同窗,也能夠分享一下,謝謝。linux

回車換行符的歷史背景:

     早期的計算機輸出設備不是顯示器,而是電傳打字機,結構與普通的打字機差很少。有一個打印頭在紙上打字,同時有一個電動機控制紙張的進出。當打印頭到達行尾的時候,須要兩個動做纔可以到達下一行的行首:windows

1: 首先執行回車動做,將打印頭移動到本行的行首;網站

2: 而後進行換行動做,電動機將紙張向上移動一行,這樣打印頭就處於下一行的行首,能夠繼續進行打印。spa

 

    回車和換行對應的控制字符分別是\r和\n,這就是windows中換行符爲\r\n的由來。操作系統

    後來因爲常常連續執行,因此在打印機中將這兩個控制字符簡化爲一個控制字符,這就是linux/unix中的換行符\n的由來。.net

不一樣操做系統換行符的區別:

Unix 系統中:   每行結尾只有 "<換行>",即 "\n";unix

          對應十六進制0x0Acode

Windows 系統中: 每行結尾是 "<回車><換行>",即 "\r\n";

          對應十六進制0x0D 0x0A

Mac 系統中:   每行結尾是 "<回車>",即 "\r"。

          對應十六進制0x0D

 

因爲換行符不一樣, 致使的結果是:

  Unix/Mac系統下的文件在Windows裏打開的話,全部文字會變成一行;

  而Windows裏的文件在Unix/Mac下打開的話,在每行的結尾可能會多出一個^M符號.

 

而在 windows下操做文件fopen使用」r」和」rb」打開文件,  結果是不同的(Linux下沒有區別):

  若是 fopen是」r」文本方式打開, 讀文件時會自動轉換換物符\r\n爲 \n。

  若是 fopen是」r」文本方式打開, 寫文件時會自動轉換換物符\n爲 \r\n。

  若是 fopen是」rb」是以二進制方式打開,不會自動轉換。

環境實驗:windows fopen r rb的區別

 在windows環境和Linux環境下,分別創建一個文本,內容相同:

  Hello World!

  5AA555AA

windows下建立的文件,命名爲windows.txt

Linux下建立的文件,命名爲Linux.txt

寫個程序將使用fopen( path, 「rb」 ) 文本里面的內容讀出來:

 
 

#include <stdio.h>

 

int main( int argc, char ** argv ){

 
 

  FILE *fp;

  char buf[255] = { 0 };

  size_t num = 0;

  int i = 0;

 

  if( argc != 2 ){

  printf( "You need to input the file to read!" );
  return -1;
}

 if((fp = fopen( argv[1], "rb" )) == NULL )
   printf( "file open failed!" );

  while( (num = fread(buf, sizeof(char), 10, fp )) > 0 ){

    for( i = 0; i < num; ++i ){

      printf( "%02X", buf[i] );

    }

  }

  fclose( fp );

  return 0;

}

fopen( path, rb ) 輸出結果爲:

 

結果以下:

  windows下建立的文本換行符仍然是 0D0A(即\r\n), 

  Linux下建立的文件爲 0A(\n)

 

將上述代碼改成 fopen( path, r )

結果以下:

 

如上, 換行符統一被轉換爲0A(即\n

 

注意: 

若是Linux建立的文本,在windows下有編輯過,文件裏面的0A會被轉換爲0D0A

好比我複製一份Linux.txt 爲Linux1.txt, 在windows下用記事板打開文件,顯示文件爲:

 

 按CTRL+S保存後, 0A被轉換爲0D0A:

 

文件格式轉換:

    那若是咱們有文件須要在不一樣的操做系統中來回切換操做, 怎麼處理文檔內的換行符呢?

方法1NotePad++ 轉換

    設置行尾符格式:編輯 ->  檔案格式轉換 ->(可選 Windows、Unix 和 Mac中的一種)(若是是英文版的 Notepad++,則應該是 Edit -> EOL Conversion -> Windows Format、Unix/OSX Format、Old Mac Format。)

方法2:  使用UNIX命令轉換:

  unix2dos -k xxx_file

  dos2unix -k xxx_file

 

參考文章: 1: https://blog.csdn.net/wzb56_earl/article/details/6860358

      2:http://www.javashuo.com/article/p-fudqczdt-mv.html

相關文章
相關標籤/搜索