簡體   English   中英

為什么fseek不起作用?

[英]why fseek doesn't work?

我寫了一個函數,列出我的文件,它是二進制文件,並用我的struct中的fwrite func編寫它:

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工作嗎?

while(!feof(bookFilePtr))是一個不好的閱讀循環方式。 !feof(...)並不保證fread會成功。 你應該fread成功時循環。

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

fseek的調用也是多余的: fread已經提升了文件光標本身,所以你不需要尋找。

while (!feof(f))並不意味着你認為它意味着什么。 它並不意味着“當前位置在文件末尾”,它意味着“最后一次讀取嘗試讀取文件末尾”:它是由fread和其他人設置的標志,由fseek和其他人清除。 fread有一個返回值。 該返回值表示讀取是否成功。 將其用作循環條件。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM