为什么fseek不起作用?

时间:2011-12-17 09:41:48

标签: c++ io

我编写了一个函数,列出我的文件,它是二进制文件,并用我的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有效吗?

2 个答案:

答案 0 :(得分:3)

while(!feof(bookFilePtr))是一种不好的阅读循环方式。 !feof(...)并不保证fread会成功。您应该在fread成功时循环

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

fseek的调用也是多余的:fread已经提升了文件光标本身,因此您无需搜索。

答案 1 :(得分:1)

while (!feof(f))并不代表您认为的含义。这并不意味着“当前位置位于文件末尾”,这意味着“上次读取尝试读取文件末尾”:它是由fread和其他人设置的标记,由fseek清除和别的。 fread具有返回值。该返回值表示读取是否成功。将其用作循环条件。

你也忽略了fseek的返回值,这也是出于同样的原因,但这不是问题的原因,至少不是直接的。

顺便说一下,我假设这只是试验fseek的代码,但循环中的fseek将位置设置为位置应该已经存在的位置,因此它不会添加任何值