作者VictorTom (鬼翼&娃娃魚)
看板C_and_CPP
標題Re: [問題] 讀檔跟開檔
時間Mon Jun 22 13:59:53 2009
※ 引述《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