Re: [問題] 讀檔跟開檔

看板C_and_CPP (C/C++)作者 (鬼翼&娃娃魚)時間16年前 (2009/06/22 13:59), 編輯推噓2(206)
留言8則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《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)

06/22 14:32, , 1F
因為把資料都放在同一個變數,第一次b的時候不會翻譯資料,所
06/22 14:32, 1F

06/22 14:33, , 2F
以每次遇到斷行都是原始呈現\r\n,而text mode遇到斷行會翻譯
06/22 14:33, 2F

06/22 14:33, , 3F
成\n,所以第二次再填資料進text會比較短,然後印出之前的尾巴
06/22 14:33, 3F

06/22 14:37, , 4F
簡單點的資料就用:1(enter)(enter)2
06/22 14:37, 4F

06/22 14:38, , 5F
1\r\n\r\n2
06/22 14:38, 5F

06/22 14:39, , 6F
1\n\n2
06/22 14:39, 6F

06/22 19:04, , 7F
剛剛掛debug看了一下, 還真的0D0A都變成0A了....Orz
06/22 19:04, 7F

06/22 19:05, , 8F
才發現原來想錯方向了, 資料是少了, 不是多出來Orz
06/22 19:05, 8F
文章代碼(AID): #1AFntQ0w (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
文章代碼(AID): #1AFntQ0w (C_and_CPP)