fread не изменяет значение указателя в функции (вызывает бесконечный цикл с помощью функции feof) - C - PullRequest
0 голосов
/ 24 октября 2018
int ricerca_copia(int x,int xf)
{

FILE *xp;
int conf;
int f;
int xeof;

f=0;
// file was already written and closed before this function
xp=fopen("prenotazioni_copy.dat","rb");
if(xp)
{
  xeof=0;

  while(xeof==0)
  {
    //Never changes xp value
    fread(&appoggio,sizeof(appoggio),1,xp);
    if(feof(xp))
    {
     //never enters here

        xeof=1;
    }
    else
    {
            //other stuff
    }
    fclose(xp);

  }
}
printf("\nValore %d",f);
return f;
}

fread не меняет значение указателя (xp), поэтому значение xeof остается 0 и цикл перезапускается

Я уже тестировал использование этой части кода извне этой функции, и она работает, вот в чем проблема.

Я не знаю, как решить, поэтому есть какое-то решение?

1 Ответ

0 голосов
/ 24 октября 2018

проблема в том, что вы вызываете fclose(xp) в вашем цикле.

Первая итерация работает нормально, но следующий fread вызов не удался (вы должны проверить, что fread возвращает BTW, он должен возвращатьсяколичество прочитанных элементов, поэтому, если это не так и возвращает 0 или -1, есть проблема), и то же самое происходит с feof для этого дескриптора (ну, на самом деле это неопределенное поведение, как указано здесь: Что такое возвратзначение feof () для закрытого файла? )

Вы хотите вызвать fclose(xp) вне цикла, или вы получите бесконечный цикл (если файл меньше, чемразмер структуры, что является еще одной функциональной ошибкой)

В стороне: xp - указатель на FILE непрозрачную структуру.Он не меняется даже с несколькими fread.Какие изменения являются скрытым значением offset.Но вы не сможете получить эту информацию, если не наберете ftell на ручке.

...