判斷檔案結束有兩種方法:eof和feof()
檢視stdio.h可以看到如下定義:
[cpp]
view plain
copy
print?
#define eof (-1)
#define _ioeof 0x0010
#define feof(_stream) ((_stream)->_flag & _ioeo
由此可以看出,這兩種方式的原理是不同的。
有人說eof只能用於文字檔案,其實不然,還要看定義的變數的型別。下面這段程式對文字檔案和二進位制檔案都可以:
[cpp]
view plain
copy
print?
intc;
while
((c=fgetc(fp)) != eof)
如果讀到了ff,由於c定義為int型,所以實際上c=0x000000ff,不等於eof(-1=0xffffffff),因此不會誤判為檔案結尾。
但是如果把c定義為char型別,就有可能產生混淆了。
[cpp]
view plain
copy
print?
char
c;
while
((c=fgetc(fp)) != eof)
因為文字檔案中儲存的是ascii碼,而ascii碼中ff代表空值(blank),一般不使用,所以如果讀檔案返回了ff,說明已經到了文字檔案的結尾。但是如果是二進位制檔案,其中可能會包含ff,因此不能把讀到eof作為檔案結束的條件,此時只能用feof()函式。
在vc裡,只有當檔案位置指標(fp->_ptr)到了檔案末尾,然後再發生讀/寫操作時,標誌位(fp->_flag)才會被置為含有_ioeof。然後再呼叫feof(),才會得到檔案結束的資訊。因此,如果執行如下程式:
[c-sharp]
view plain
copy
print?
char
c;
while
(!feof(fp))
會發現多輸出了乙個ffffffff,原因就是在讀完最後乙個字元後,fp->flag仍然沒有被置為_ioeof,因而feof()仍然沒 有探測到檔案結尾。直到再次呼叫fgetc()執行讀操作,feof()才能探測到檔案結尾。這樣就多輸出了乙個-1(即ffffffff)。
正確的寫法應該是:
[cpp]
view plain
copy
print?
char
c;
c = fgetc(fp);
while
(!feof(fp))
這麼說其實feof()是可以用eof來代替的嘍?不是,這裡還有乙個問題。fgetc返回-1時,有兩種情況:讀到檔案結尾或是讀取錯誤。因此我們無法確信檔案已經結束, 因為可能是讀取錯誤! 這時我們需要feof()。
判斷檔案結束有兩種方法 EOF和feof
判斷檔案結束有兩種方法 eof和feof 檢視stdio.h可以看到如下定義 由此可以看出,這兩種方式的原理是不同的。有人說eof只能用於文字檔案,其實不然,還要看定義的變數的型別。下面這段程式對文字檔案和二進位制檔案都可以 如果讀到了ff,由於c定義為int型,所以實際上c 0x000000ff,...
判斷檔案結束有兩種方法 EOF和feof
判斷檔案結束有兩種方法 eof和feof 檢視stdio.h可以看到如下定義 由此可以看出,這兩種方式的原理是不同的。有人說eof只能用於文字檔案,其實不然,還要看定義的變數的型別。下面這段程式對文字檔案和二進位制檔案都可以 如果讀到了ff,由於c定義為int型,所以實際上c 0x000000ff,...
判斷委託操作結束的兩種方法
眾所周知,委託的執行過程類似於執行緒的執行 實際上本質就是執行緒 當委託被 invoke 以後,程式會開啟乙個非同步執行緒執行委託,當委託執行完畢時執行緒自動終止。那麼當委託被呼叫以後,如何判斷委託是否已經執行完畢呢?本文給出兩種方式判斷委託是否執行完畢。1 根據返回值判斷。當程式呼叫 begini...