當我們使用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。我們看...