Так что я использую структуру для атрибутов автомобиля. Я пытаюсь найти конкретный c автомобиль в списке, хранящемся в двоичном файле (Machines.bin).
Проблема заключается в том, что мой алгоритм находит автомобиль в положении ", указанном введенным числом +1 ". Я хочу, чтобы он показал мне автомобиль с номером, введенным в качестве уникального ключа.
У меня в записи 20 машин, и если я пытаюсь вставить, например, «123», который является уникальным ключом для определенной машины, он отображает на экране тра sh, как случайную часть памяти. Я думаю, что не правильно использую fseek (), но у меня все еще нет идей, как заставить это работать так.
Вторая программа должна работать так же, как и код. Но он находит указатель c (в данном случае «студент»), который имеет уникальный ключ, введенный в качестве ввода при запуске. И не так, как моя программа, чтобы идентифицировать по введенной позиции.
Вот коды:
#include <stdio.h>
#include <conio.h>
typedef struct {
int key;
char color[20];
int price;
char brand[15];
char is;
}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;
fopen_s(&inBinFile, "Machines.bin", "rb+");
fileDim = sizeOfFile(inBinFile, sizeof(CAR));
fseek(inBinFile, 0, SEEK_SET);
printf_s("Type a specific nr. to identify a car...");
scanf_s("%d", &chooseKey);
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();
}
#include <stdio.h>
#include <conio.h>
typedef struct {
int nrm; //enrolment number - works as relative key
char CNP[14]; //string ASCIIZ
char nume[30]; //string
int an; //study year
int grupa; //group
unsigned char note[20]; //grades
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()
{
FILE* f;
STUDENT x;
int key, dim;
fopen_s(&f, "Studenti_r_f.dat", "rb+");
dim = filesize(f, sizeof(STUDENT));
printf_s("Enrollment number: ");
scanf_s("%d", &key);
while (key != -1)
{
if (key >= dim)
printf_s("\nThere is no student with this enrollment number. Try again?");
else
{
fseek(f, key * sizeof(STUDENT), SEEK_SET);
fread(&x, sizeof(STUDENT), 1, f);
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 -1): ");
scanf_s("%d", &key);
}
fclose(f);
printf("\nDone. Press a key.", "Studenti_r_f.dat");
_getch();
}