[英]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.