我编写了一个函数,列出我的文件,它是二进制文件,并用我的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有效吗?
答案 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
将位置设置为位置应该已经存在的位置,因此它不会添加任何值