盡量不要使用文字模式

2021-09-07 21:21:29 字數 1239 閱讀 8137

當我們使用c的庫函式讀取檔案時,會有文字模式和二進位制模式兩種讀取模式。一些傳輸資料的協議比如tftp、ftp也有文字和二進位制模式的區分。既可以使用文字模式也可以使用二進位制模式時,盡量使用二進位制模式。

文字模式和二進位制模式讀取檔案時,差別主要是在回車換行的處理上,不同系統對回車換行的處理不一致。

cr:  carriage return,  0x0d,   「/r」

lf:  line feed,         0x0a,   「/n」

dos和windows採用回車+換行(cr+lg)表示下一行

unix採用換行符(lf)表示下一行

mac機採用回車符(cr)表示下一行

unix、linux的c的庫函式處理檔案時不區分文字和二進位制,但是windows系統下c的庫函式讀取和寫入文字檔案時會自動處理回車換行。(測試通過)windows下以文字模式讀取檔案時,讀取到0d0a時會跳過0d,比如檔案內容是0d 0d 0a 0a,則讀取到的是0d 0a 0a;

以文字模式寫檔案時,會自動在每個0a前面加上0d,如果讀取到的是 0d 0a 0a,

則寫入到檔案中的是 0d 0d 0a 0d 0a。我們可以看出檔案內容發生了變化,與檔案原來的內容已經不同了。

文字模式下讀取檔案時處理回車換行的**在/vc/crt/src/read.c 的265~356行。

line:291 /* *p is cr, so must check next char for lf */

if (p < (char *)buf + bytes_read - 1)

else

*q++ = *p++;    /* store char normally */

文字模式下寫檔案時處理回車換行的**在/vc/crt/src/write.c 的268~308行。

line:282 /* fill the lf buf, except maybe last char */

while ( q - lfbuf < sizeof(lfbuf) - 1 &&

(unsigned)(p - (char *)buf) < cnt )

*q++ = ch;

windows下文字模式開啟檔案時,要慎用ftell()函式。由於ftell()函式實現中對lf進行了特殊處理,導致ftell()返回的結果可能不是我們需要。

使用二進位制模式可以保證檔案的內容沒有被修改,在需要進行特殊處理的地方我們自己可以進行特殊的處理,而類庫自作聰明的處理很多時候反而弄巧成拙。

**:

盡量不要使用FindWindow

盡量不用 findwindow 最近發現 se6和 se5程序共存時視窗名稱一樣引起的 bug。原因是我們經常使用 findwindow 來獲得視窗控制代碼,然後進行訊息通訊,這樣呼叫簡單,但增加了不同模組之間的依賴性,比如同時有兩個程序時,就可能會找錯視窗。而如果靠人去維護這個視窗名稱,在程式工程...

盡量不要使用可變引數

在某些情況下我們希望函式引數的個數可以根據實際需要來確定,所以c語言中就提供了一種長度不確定的引數,形如 c 語言也繼承了這一語言特性。在採用ansi標準形式時,引數個數可變的函式的原型是 typefuncname typepara1,typepara2,這種形式至少需要乙個普通的形式引數,後面的省...

盡量不要使用CSS Expression的原因

在程式設計客棧csvwhlqyeiys expression中使用j ascript表示式。css屬性根據j ascript表示式的計算結果來設定。c expression在其它瀏覽器中不起作用,因此在跨瀏覽器的編碼中單獨針對ie設定時會比較有用。從ie5開始支援css expression。我們看...