C++中是通過(guò)流的方式來(lái)訪(fǎng)問(wèn)文件的,比如說(shuō)語(yǔ)句 ifstream in("str.txt",ios::in); ,就打開(kāi)了文件str.txt。我們可以通過(guò)in.read()來(lái)讀取流in(也就是文件str.txt)中的數(shù)據(jù),F(xiàn)在問(wèn)題來(lái)了:我們?cè)趺磁袛嗪螘r(shí)讀到了這個(gè)文件的末尾呢? 在C++中,文件的結(jié)束標(biāo)志是EOF——顧名思義,End Of File。也就是說(shuō),在文件的某個(gè)字節(jié)b后面加入一個(gè)EOF,就表示這個(gè)字節(jié)b就是該文件的最后一個(gè)字節(jié)了。這里順便說(shuō)一句,EOF占一個(gè)字節(jié)的大小,其值為-1。 還是舉個(gè)例子吧!——運(yùn)行環(huán)境為Microsoft Visual C++ 2005。 #include <fstream> #include <iostream> using namespace std;
int main()...{ char c=’a’; ofstream out("str.txt",ios::out); for(int i=0;i<10;i++,c++) out.write(&c,sizeof(char)); out.close();
int i=0; ifstream in("str.txt",ios::in); while(in)...{ c=in.get(); cout<<c; i++; } cout<<i;
cin.get(); } 在in讀完字符’j’的時(shí)候,其實(shí)已經(jīng)到達(dá)文件的末尾了,但此時(shí)流in的狀態(tài)還是good,也就是說(shuō)還可以繼續(xù)讀入下一個(gè)字節(jié)。而當(dāng)in繼續(xù)往下讀的時(shí)候,就會(huì)讀到EOF了,當(dāng)讀完EOF并賦值給c后,流in的狀態(tài)就變成了eofbit,不可再讀,在條件判斷語(yǔ)句中流in也就成了false了。所以真正讀入的字節(jié)數(shù)其實(shí)是11,而不是文件的長(zhǎng)度10。 而文件的輸出為 abcdefghij11 ,用UltraEdit打開(kāi),切換到16進(jìn)制模式下可以看到,j和11中間的那個(gè)空格的ASCII碼為FF,也就是2進(jìn)制的11111111,就是-1的補(bǔ)碼。
|