CR( #13)與CRLF(#13#10)在使用上有何不同? |
答題得分者是:Justmade
|
ry_lee
高階會員 發表:368 回覆:251 積分:123 註冊:2002-03-19 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
那要看你甚麼用 以 Text File 來說
在 PC 上換行是使用 CRLF 的 (Carage Return 只將指標回到最頭並不會自動下一行,要配合 Line Feed 來進到下一行)
在 Unit / Linex / Mac 等換行是直接使用 CR 的 (大部份情況使用 LF 也會得到同樣效果) 所以若Text File 使用 CRLF 在 PC 正常但到 Unix / Mac 便成了雙換行,反之用 CR 在 Unix/Mac 正常到了 PC 沒有換行 在其他軟件的文件會因應軟件的設計使用不同的設定,不一定會似 OS 的做法,如 Flash 內無論 PC / Mac / Linex 版本都是使用 CR 或 LF 換行而 CRLF 會變成雙換行。
|
Jasonwong
版主 發表:49 回覆:931 積分:581 註冊:2006-10-27 發送簡訊給我 |
|
axsoft
版主 發表:681 回覆:1056 積分:969 註冊:2002-03-13 發送簡訊給我 |
這有一篇文章給您參考一下
◇ 換行模式
http://bbs.ee.ntu.edu.tw/boards/Programming/7/11.html 在 DOS 下 '\n' 仍然只是一個字元, 而且值和 UNIX 沒有什麼兩樣.
事實上, 不論在任何作業系統, 99.99% 的 C compiler 都會把 '\r'
直接編成十進位的 13, '\n' 編成 10. (0.01% 的是有 bug 的)
從 C 的基本定義來說, 單引號括起來的字元完全同等於 integer,
那麼一個 integer 怎麼會等於兩個字元呢? 問題出在當初 C 是在 UNIX 上發展的, UNIX 本來就沒有文字檔或二進
位檔的分別, 所以當初挑了 '\n' 來當 line delimiter (或說換行碼).
只要一個 byte. 而 DOS 卻在作業系統中定義了文字檔用 CRLF 來分
隔兩行, 為了讓 C 的程式可以 porting, 不需讓程式師寫出類似 #ifdef DOS
printf("hello world\r\n");
#else
printf("hello world\n");
#endif 這樣的程式, 所以 PC 的 C standard I/O library (如 fopen, fprintf,
fgets, printf 等) 函數在 default mode (text mode) 會做 CRLF -> LF
轉換, 也就是在緩衝區內掃描是否有 CRLF ("\r\n") 這樣的pattern, 主動
將其換成 LF ("\n"), 因此, 你可以發現 UNIX 的程式碼可以直接和 DOS
相通. 反之, 在寫入時, 會將 LF 轉換成 CRLF, 這樣存在磁碟中的文字檔
其他如 pe2 等編輯程式也可以正確讀取. 至於若是開檔時用 binary mode, 則不會作上述的轉換, 你可以發現
printf("hello world\n"); 輸出的結果其他 editor 不能正常讀取,
反之 printf("hellow world\r\n"); 則正常. 至於 open 系列, 若用 O_TEXT 開檔, 也會轉換. 主要也是為了讓類似下列
的程式碼能正常運作.
char *p = "hello world\n"
write(1, p, strlen(p)); HAVE A NICE DAY FOR YOU
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |