Запись / чтение структуры в / из файла в C - PullRequest
0 голосов
/ 26 апреля 2020

Привет, поэтому я разработал структуру для медицинской карты и хотел создать функции для чтения и записи в файл. Я пытался использовать fread() и fwrite() для этой цели, но он не делает это правильно. Когда я пытаюсь снова прочитать файл, он просто возвращает непригодные данные, такие как фрагменты путей к файлам. В основном, случайные места в памяти.

Вот мой код для записи в двоичный файл:

void savePatientProfile(struct healthRecord *hrptr, char *file_name) {
    FILE *fp;
    struct healthRecord hr;

    hr = *hrptr;
    fp = fopen(file_name, "wb");

    fwrite(&hr, sizeof(struct healthRecord), 1, fp);
}

Вот код для чтения файла:

struct healthRecord *readPatientProfile(char *file_name) {
    FILE *fp;
    struct healthRecord *hrptr;

    fp = fopen(file_name, "rb");
    hrptr = malloc(sizeof(struct healthRecord));

    fread(hrptr, sizeof(struct healthRecord), 1, fp);

    return hrptr;
}

Код для моей структуры и основной функции:

int main() {
    struct healthRecord *hrptr = getPatientProfile();
    savePatientProfile(hrptr, "test.bin");

    struct healthRecord *hrptr2 = readPatientProfile("test.bin");
    showPatientProfile(hrptr2);

    return 0;
}

struct healthRecord {
    // Store first & last name with maximum length of 50
    char first_name[MAX_STR_LEN];
    char last_name[MAX_STR_LEN];

    // Store date of birth
    struct birth_date {
        // Define date variable, max value is 2047
        unsigned int year : 11;

        // Define month variable,  max value is 15
        unsigned int month : 4;

        // Define day variable, max value is 31
        unsigned int day : 5;
    } birth_date;

    // Store gender; 0 for male, 1 for female
    unsigned int gender : 1;

    // Store height in cm; max possible height 255cm
    unsigned int height : 8;

    // Store weight and BMI
    float weight;
    float bmi;

    // Store address in another struct
    struct address {
        char city[MAX_STR_LEN];
        char street_name[MAX_STR_LEN];

        // Store street number as string, in case of special characters, e.g. 2A
        char street_number[6];

        // Store postcode; 5 digits + terminating character
        char postcode[6];
    } address;

    // Store vaccination History; Values can only be 0 for no and 1 for yes
    struct vaccination_history {
        unsigned int yellow_fever : 1;
        unsigned int hepatitis : 1;
        unsigned int malaria : 1;
        unsigned int bird_flue : 1;
        unsigned int polio : 1;
    } vacc_history;

    // Store additional information depending on the patient type
    // Can either store value or n/a if type does not match
    union additional_information {
        // Store sodium level for adult man
        char sodium_level[4];

        // Store potassium level for adult woman
        char potassium_level[4];

        // Store school(preschool, preschool class, comprehensive school) for a child (< 16)
        struct school {
            char preschool[MAX_STR_LEN];
            char preschool_class[MAX_STR_LEN];
            char comprehensive_school[MAX_STR_LEN];
        } school;
    } add_info;
};

Я не настолько знаком с чтением и записью в файлы в C, а код, который я использовал, был в основном из других постов здесь, посвященных stackoverflow и некоторые другие онлайн-ресурсы, такие как tutorialspoint. Буду очень признателен, если вы поможете мне с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...