2011-12-17 81 views
1

我寫道,列出我的文件,它的二進制文件,並將其與fwrite的FUNC從我的結構寫一個函數:爲什麼fseek不起作用?

void ReadFile::printList(){ 
clearerr(bookFilePtr); 
fseek(bookFilePtr,0L,SEEK_SET); // set to begin of file 
int counter = 1; 
cout << "***************************************************" << endl; 
struct book tmp ; 
while (!feof(bookFilePtr)){ 
      fread(bookPtrObj,sizeof(struct book),1,bookFilePtr); 
    cout << bookPtrObj->name << "s1"<< endl; 
    cout << bookPtrObj->publisher << "s2"<< endl; 
    cout << bookPtrObj->author << "s3" <<endl; 
    cout << bookPtrObj->stock << endl; 
    cout << bookPtrObj->translation << endl; 
    cout << bookPtrObj->trasnlator << "s4" <<endl; 
    cout << bookPtrObj->delayDays << endl; 
    cout << bookPtrObj->delayPay << endl; 
    cout << "***************************************************" << endl; 
    fseek(bookFilePtr,counter * sizeof(struct book) ,SEEK_SET); // seek to next data 
    counter ++; 
} 

它打印一次我所有的文件,但並沒有從我的循環退出。我的func繼續打印文件中的最後一個數據。我該如何退出我的func並找出文件結尾? fseek工作嗎?

+0

你爲什麼還要打擾?無論如何,您已經通過(最多)sizeof(struct book)字節移動了文件指針。無論如何,你實際上應該在每次通話時檢查fread的結果,但這是另一回事。 – 2011-12-17 09:45:47

回答

3

while(!feof(bookFilePtr))是做閱讀循環的不好方法。 !feof(...)不能保證fread會成功。你應該循環fread成功

while(fread(bookPtrObj, sizeof(struct book), 1, bookFilePtr) == 1) { 
    // blah blah do the things 
} 

的調用fseek是多餘太:fread已經前移文件光標本身,所以你不需要尋求。

1

while (!feof(f))並不意味着你的想法。這並不意味着'當前位置在文件末尾',這意味着'上次讀取試圖讀取文件末尾':這是一個由fread等設置的標誌,並由fseek等人清除。 fread有返回值。該返回值指示讀取是否成功。用它作爲你的循環條件。

你忽略了fseek的返回值,這也是出於同樣的原因,但這不是問題的原因,至少不是直接的原因。

順便說一句,我假設這只是代碼fseek的實驗,但你的fseek在循環中設置的位置應該已經是位置,所以它不會增加任何值。