用C寫(xiě)了一個(gè)讀文件的函數(shù),讀普通文本沒(méi)有問(wèn)題,可是當(dāng)讀取一些二進(jìn)制文件時(shí)就出現(xiàn)問(wèn)題了--函數(shù)總是沒(méi)法把文件的所有內(nèi)容讀出來(lái).
郁悶了兩天,終于找到答案.
原程序:
void bFile2str(String fpath, String& rStr){
FILE* infile;
infile = fopen(fpath.c_str(), "rb");
if (infile == NULL) {
MessageBox(NULL, to open"Fail file, please check your path ..." , "Error" , MB_ICONWARNING);
return;
}
int cTemp;
int i=1;
cTemp = fgetc(infile);
while (cTemp != EOF) {
rStr = rStr + " ";
rStr[i] = cTemp;
cTemp = fgetc(infile);
i ++;
}
fclose(infile);
}
后來(lái)改成:
void bFile2str(String fpath, String& rStr){
FILE* infile;
infile = fopen(fpath.c_str(), "rb");
if (infile == NULL) {
MessageBox(NULL, "Fail to open file, please check your path ..." , "Error" , MB_ICONWARNING);
return;
}
int cTemp;
int i=1;
cTemp = fgetc(infile);
while (!feof(infile)) {
rStr = rStr + " ";
rStr[i] = cTemp;
cTemp = fgetc(infile);
i ++;
}
fclose(infile);
}
分析:
EOF 是文件結(jié)束符, 當(dāng) fgetc 讀字符時(shí)遇到文件結(jié)束符時(shí), 將返回一個(gè)文件結(jié)束標(biāo)志 EOF(即-1). 如果是普通文本, 當(dāng)然可以用EOF來(lái)判斷是否已到文件尾, 但在二進(jìn)制文件中可能包含多個(gè) EOF 標(biāo)志符, 這時(shí)就會(huì)出現(xiàn)文件還沒(méi)讀完就被認(rèn)為文件已經(jīng)結(jié)束的情況. 而 feof() 就解決了這個(gè)問(wèn)題, 它可以用來(lái)測(cè)試當(dāng)前文件指針是否在文件尾, 它和 EOF 的機(jī)理完全不同, 當(dāng)然會(huì)跳過(guò)中間的許多 EOF 字符.