看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《qazq (...)》之銘言: : 推 ianfang:最後一句不對~是如果你要做的是讀取exe或是bmp等非文字檔 06/22 00:06 : → ianfang:類的才是用wb rb 06/22 00:07 : → zlw:有b的比較保險,我看現在Windows的記事本都沒在用text mode不 06/22 09:30 : → zlw:然怎會都沒在鳥0x1A的 06/22 09:30 : 推 ianfang:我是要說的是 不是因為用fread/fwrite 才用wb/rb 06/22 13:17 小弟原本的認知也是, 要用fread/fwrite時最好用b mode.... 如果都是fscanf/fprintf處理純文字時, 可以考慮用t mode.... 感覺就好像ftp裡用ASC mode或者是BIN mode傳輸時的影響.... (Hmm~~這樣也不太對, 從實測的差異來看應該不是換行的問題) 小弟剛好今天早上在搞OpenGL的GLSL的shader code時.... 也被fopen的mode給愚弄了一個上午, 下面貼段小sample吧:) ========資料檔案: TextFile.txt======== 1234567 7654321 1357246 2461357 ABCDEFG abcdefg AbCdEfG aBcDeFg 1234567 7654321 1357246 2461357 ABCDEFG abcdefg AbCdEfG aBcDeFg ========資料檔結束, 最後僅換行======== ========測試用的小程式 開始區======== #include <cstdio> #include <cstdlib> int main(void) { int size = 0; FILE *fp = NULL; char text[1024] = {0}; fp = fopen("TestFile.txt", "rb"); fseek(fp, 0, SEEK_END); size = ftell(fp); printf("Open by binary: %d\n", size); fseek(fp, 0, SEEK_SET); fread(text, 1, size, fp); text[size] = '\0'; printf("%s\n", text); fclose(fp); fp = fopen("TestFile.txt", "rt"); fseek(fp, 0, SEEK_END); size = ftell(fp); printf("Open by text: %d\n", size); fseek(fp, 0, SEEK_SET); fread(text, 1, size, fp); text[size] = '\0'; printf("%s\n", text); fclose(fp); system("PAUSE"); return 0; } ========測試用的小程式 結束區======== 程式很簡單, 開檔, 算大小, fread讀檔, 印出來, 關檔.... 資料檔是純文字(MS Win下), 兩小段最大的差異也只有而已.... 而檔案大小在檔案總管下看的確都是134 bytes.... 但是下面後者的結果, 浪費了小弟今天一整個早上Q_Q~ ========Dev C++執行結果 開始區======== Open by binary: 134 1234567 7654321 1357246 2461357 ABCDEFG abcdefg AbCdEfG aBcDeFg 1234567 7654321 1357246 2461357 ABCDEFG abcdefg AbCdEfG aBcDeFg Open by text: 134 1234567 7654321 1357246 2461357 ABCDEFG abcdefg AbCdEfG aBcDeFg 1234567 7654321 1357246 2461357 ABCDEFG abcdefg AbCdEfG aBcDeFg eFg Press any key to continue . . . ========Dev C++執行結果 結束區======== 小弟還沒時間去研究分析, 解釋的部份就留給諸位先進吧<(_ _)> -- 不好意思, 手動修一下printf的typo....@_@" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 222.66.238.68 ※ 編輯: VictorTom 來自: 222.66.238.68 (06/22 14:16)
zlw:因為把資料都放在同一個變數,第一次b的時候不會翻譯資料,所 06/22 14:32
zlw:以每次遇到斷行都是原始呈現\r\n,而text mode遇到斷行會翻譯 06/22 14:33
zlw:成\n,所以第二次再填資料進text會比較短,然後印出之前的尾巴 06/22 14:33
zlw:簡單點的資料就用:1(enter)(enter)2 06/22 14:37
zlw: 1\r\n\r\n2 06/22 14:38
zlw: 1\n\n2 06/22 14:39
VictorTom:剛剛掛debug看了一下, 還真的0D0A都變成0A了....Orz 06/22 19:04
VictorTom:才發現原來想錯方向了, 資料是少了, 不是多出來Orz 06/22 19:05