Почему fseek не возвращает позицию здесь, а просто перенаправляет fread на указанную c запись? - PullRequest
0 голосов
/ 08 апреля 2020

Итак, у меня есть папка двоичного ввода, содержащая некоторых студентов и их информацию. И я не понимаю некоторые вещи, касающиеся fseek и fread там после функции while. После того, как я запустил его и набрал ключ для поиска ученика, он печатает ученика, связанного с этим ключом, вместо того, который находится на этой позиции (измерение в байтах от начала координат в качестве смещения). И я хочу знать, почему, чтобы использовать информацию для моего проекта, эта программа является своего рода учебником от профессора. Заранее спасибо!

* РЕДАКТИРОВАТЬ (Вторая программа - моя попытка для проекта, но с автомобилями. На выходе получается машина, находящаяся в позиции "chooseKey", а не с "chooseKey" в качестве атрибута, как первая программа. И я не знаю, что я сделал не так.)

   #include <stdio.h> 
   #include <conio.h> 

typedef struct { 

                 int nrm;             
                 char CNP[14];         
                 char nume[30];      
                 int an;              
                 int grupa;           
                 unsigned char note[20];  
                 char is;
               } STUDENT;

int filesize(FILE* f, int rec_size)
{
  long crt_pos;
  int size;

  crt_pos = ftell(f);  
  fseek(f, 0, SEEK_END) ;    
  size=ftell(f) / rec_size;  
  fseek(f, crt_pos, SEEK_SET); 
  return size; 

}

void main()
{ char numefr[30] = "Studenti_r_f.dat";
  FILE* f;
  STUDENT x;
  int key, dim;

  fopen_s(&f, numefr, "rb+");
  dim=filesize(f, sizeof(STUDENT)); 

  printf_s("Enrollment number: ");
  scanf_s("%d", &key);
  while(key != 0)
  {
    //check key range
    if(key >= dim)
      printf_s("\nThere is no student with this enrollment number. Try again?");
    else
    {
      //check if valid key
      fseek(f, key*sizeof(STUDENT), SEEK_SET);
      fread(&x, sizeof(STUDENT), 1, f);
      if(x.is == 0)
        printf("\nThere is no student with this enrollment number. Try again?");
      else
        printf_s("\nStudent: %s, Year: %d, Group: %d, ATP grade: %d\n",x.nume,x.an,x.grupa,x.note[5]);
    }
    printf_s("\n\nEnrollment number (or 0): ");
    scanf_s("%d", &key);
  }

 fclose(f);

 printf("\nDone. Press a key.",numefr);
 _getch();
}
typedef struct {
    int key;
    char color[20];
    int price;
    char brand[15];
}CAR ;

int sizeOfFile(FILE* inBinFile, int sizeOfRecord)
{
    long currentPosition;
    int size;

    currentPosition = ftell(inBinFile);
    fseek(inBinFile, 0, SEEK_END);
    size = ftell(inBinFile) / sizeOfRecord;
    fseek(inBinFile, currentPosition, SEEK_SET);
    return size;
}
void main()
{
    FILE * inBinFile;
    CAR var;
    int chooseKey, fileDim;

    printf_s("Type a key to identify a car..."); // 20 records in the file
    scanf_s("%d", &chooseKey); 

    fopen_s(&inBinFile, "Machines.bin", "rb+");
    fileDim = sizeOfFile(inBinFile, sizeof(CAR));

    while (chooseKey != -1)
    {
        if (chooseKey >= fileDim)
            printf_s("\nNo car with key %d found. Retry.", chooseKey);
        else
        {
            fseek(inBinFile, chooseKey*sizeof(CAR), SEEK_SET);
            fread(&var, sizeof(CAR), 1, inBinFile);
            printf_s("\nThe %d key indicates to the %s car coloured in %s which cost %d dollars", chooseKey, var.brand, var.color, var.price);
        }
        printf_s("\n\n\nTo search for another car enter a key, or hit 1 and enter to stop: ");
        scanf("%d", &chooseKey);
    }
    fclose(inBinFile);
    printf_s("\nAlright. Press any key...");
    _getch();
}   ```
...