почему fseek не работает? - PullRequest
       5

почему fseek не работает?

1 голос
/ 17 декабря 2011

Я написал функцию, которая перечисляет мой файл в двоичном виде и записывает его с помощью функции fwrite из моей структуры:

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 ++;
}

Она печатает один раз весь мой файл, но не выходит из цикла,и моя функция продолжает печатать последние данные в файле. Как мне выйти из функции и найти конец файла?fseek работает?

Ответы [ 2 ]

3 голосов
/ 17 декабря 2011

while(!feof(bookFilePtr)) плохой способ сделать цикл чтения.!feof(...) не гарантирует успеха фреда.Вы должны выполнить цикл , в то время как fread вместо этого следует .

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

Вызов fseek также избыточен: fread уже перемещает сам курсор файла, поэтому вы ненадо искать.

1 голос
/ 17 декабря 2011

while (!feof(f)) не означает, что вы думаете, что это значит. Это не означает, что «текущая позиция находится в конце файла», это означает «последняя попытка чтения прочитала конец файла»: это флаг, установленный fread и другими, и очищенный fseek и другими. fread имеет возвращаемое значение. Это возвращаемое значение указывает, было ли чтение успешным. Используйте это как условие вашего цикла.

Вы также игнорируете возвращаемое значение fseek, что плохо по тем же причинам, но это не является причиной вашей проблемы, по крайней мере, не напрямую.

Кстати, я предполагаю, что это просто код для эксперимента с fseek, но ваши fseek в цикле устанавливают позицию на то место, где она должна быть, поэтому она не добавляет никакого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...