1. 程式人生 > >文字模式讀寫檔案中\r和\n的問題

文字模式讀寫檔案中\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