Борьба за поиск указанной c записи (по уникальному ключу) в двоичном файле с помощью fseek () - PullRequest
0 голосов
/ 09 апреля 2020

Так что я использую структуру для атрибутов автомобиля. Я пытаюсь найти конкретный 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();
}
...