Итак, у меня есть папка двоичного ввода, содержащая некоторых студентов и их информацию. И я не понимаю некоторые вещи, касающиеся 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();
} ```