文字模式讀寫檔案中\r和\n的問題
原文地址:http://blog.sina.com.cn/s/blog_65db99840100kidc.html
DOS檔案(windows格式檔案)中,按一下ENTER就是輸入了\r\n,這就是回車換行
MAC檔案裡,用\r換行
UNIX檔案裡,用\n換行
自己嘗試了一些\r \n的組合,歸納了下規律:
windows下用文字方式寫檔案時
緩衝區裡的\n或者\r都會被自動替換為\r\n寫入檔案,即使是連著的\r\n,也會被替換成\r\n\r\n(但是msdn上面只說\r被替換為\r\n,我的前面一篇博文裡有原文)
windows下用文字方式讀檔案時
檔案中的\r\n自動替換為\n存放到緩衝區裡(這點和msdn是符合的,前面的博文裡有原文)
\r不會被替換
假設要讀取的檔案流長度小於緩衝區長度
如果用fread文字模式讀檔案,\r\n被替換為\n讀進快取區裡
如果是fgets文字模式讀檔案,碰到第一個\n(這裡的\r和\n都是指經過轉換後讀入緩衝區的,即\r\n被替換為\n)後停止讀取,快取區裡存放的是\n之前的字串(包括這個\n以及之前所有的\r)
fread和fwrite的返回值問題
文字模式寫檔案時,\n或\r自動替換成\r\n,但是fwrite的返回值裡還是算寫了一個字元(和msdn符合,前面一篇博文有原文)
文字模式讀檔案時,\r\n被自動替換為\n,但是也算是讀了一個字元(和msdn的不一樣,msdn是說算讀了2個,前面的博文裡有原文)
如果用UltraEdit開啟文字檔案有時候會碰到詢問你是否要轉換為DOS檔案,其實就是回車換行符的問題了。做了如下表的嘗試,但是規律不太好總結啊。
要寫入的字元 |
實際寫入的字元(即\n被替換為\r\n後) |
Ultraedit轉換為DOS格式後的檔案內的實際字元 |
\r |
\r |
\r\n |
\n |
\r\n |
未提示轉換為DOS檔案 |
\r\n |
\r\r\n |
\r\n |
\n\r |
\r\n\r |
未提示轉換為DOS檔案 |
\n\r\n |
\r\n\r\r\n |
\r\n\r\n |
\n\r\n\r |
\r\n\r\r\n\r |
\r\n\r\n |
\n\r\n\n\r |
\r\n\r\r\n\r\n\r |
\r\n\r\n\r\n\r\n |
\r\r\n\n |
\r\r\r\n\r\n |
\r\n\r\n\r\n |
\r\r\r\n\r\n |
\r\r\r\r\n\r\r\n |
\r\n\r\n\r\n\r\n |
\n\r\r |
\r\n\r\r |
\r\n\r\n\r\n |
\n\r\r\r\r |
\r\n\r\r\r\r |
\r\n\r\n\r\n\r\n\r\n |