由於在工做過程當中, 常常會切換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環境和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:
那若是咱們有文件須要在不一樣的操做系統中來回切換操做, 怎麼處理文檔內的換行符呢?
設置行尾符格式:編輯 -> 檔案格式轉換 ->(可選 Windows、Unix 和 Mac中的一種)(若是是英文版的 Notepad++,則應該是 Edit -> EOL Conversion -> Windows Format、Unix/OSX Format、Old Mac Format。)
unix2dos -k xxx_file
dos2unix -k xxx_file
參考文章: 1: https://blog.csdn.net/wzb56_earl/article/details/6860358