Двоичные файлы для чтения и записи - PullRequest
0 голосов
/ 06 мая 2018

Итак, у меня проблема с бинарным файлом. (Да, я новичок, но кое-что знаю.)

Почему мой бинарный файл не "помнит", что я написал в прошлый раз, когда я запускаю свою программу?

Похоже, что он просто удаляет все или просто не может прочитать, что находится внутри файла, поэтому каждый раз, когда я запускаю свою программу, мне нужно снова записывать все параметры.

header.h

#ifndef HEADER_H
#define HEADER_H

typedef struct user {
    char name[30];
    char last_name[30];
    int id_number;
    int phone;
} USER;

void reading(FILE*, int, USER*);
void writeing(FILE*, int, USER*);


#endif

Это внутри main (Source.c)

int main() {

    int n = 0, user_number = 0;

    USER *user = NULL;
    user = (USER*)calloc(100, sizeof(USER));
    FILE *dat = NULL;

    while (n != 4) {
        printf("Press 1 for creating binary file! \n");
        printf("Press 2 for reading! \n");
        printf("Press 3 to enter new user! \n");
        printf("Press 4 to exit!\n\n");
        printf("Number: ");
        scanf("%d", &n);
        printf("\n");

        switch (n)
        {
        case 1:
            dat = fopen("User.bin", "wb");
            printf("File created.\n");
            fclose(dat);
            break;

        case 2:
            dat = fopen("User.bin", "rb");
            reading(dat, user_number, user);
            printf("\n");
            fclose(dat);
            break;

        case 3:
            user_number++;
            printf("Insert details of %d user: \n", user_number);
            dat = fopen("User.bin", "ab");
            writeing(dat, user_number, user);
            printf("\n");
            fclose(dat);
            break;

        case 4:
            printf("Program closed!\n");
            break;

        default:
            break;
        }
    }
    free(user);
    system("PAUSE");
    return 0;
}

Это внутренняя функция, также функции организованы в другой файл (Functions.c).

void writeing(FILE* dat, int user_number, USER* user) {

    int i = user_number- 1;

    printf("Name: ");
    scanf("%s", (user + i)->name);

    printf("Last name: ");
    scanf("%s", (user + i)->last_name);

    printf("ID number: ");
    scanf("%d", &(user + i)->id_number);

    printf("Phone: ");
    scanf("%d", &(user + i)->phone);
    fwrite(user, sizeof(*user), 1, dat);
}


void reading(FILE* dat, int user_number, USER* user)
{
    fread(user, sizeof(USER), user_number, dat);
    for (int i = 0; i < user_number; i++)
    {
        fprintf(stdout, "Name: %s\nLast name: %s\nID number: %d\nPhone: 0%d\n", (user + i)->name, (user + i)->last_name, (user + i)->id_number, (user + i)->phone);
    }
}

1 Ответ

0 голосов
/ 07 мая 2018

Вы ничего не пишете в файл, по крайней мере, в фрагменте кода, который вы предоставили. Вероятно, что вы хотите сделать, это:

// my guess what USER is, because you didn't provide.....
typedef struct USER_s {
char name[200];
char last_name[200];
int id_number;
int phone;
} USER;

void writeing(FILE* dat, int user_number, USER* user) {

    int i = user_number- 1;

    printf("Name: ");
    scanf("%s", (user + i)->name);

    printf("Last name: ");
    scanf("%s", (user + i)->last_name);

    printf("ID number: ");
    scanf("%d", &(user + i)->id_number);

    printf("Phone: ");
    scanf("%d", &(user + i)->phone);

    // write 1 time sizeof(USER) length data pointed to by 'user' variable to dat file
    size_t ret = fwrite(&user[i], sizeof(*user), 1, dat);
    // assertion for safety
    assert(ret == sizeof(*user));
}

void ispis(FILE* dat, int user_number, USER* user)
{
    // read from dat file user_number times sizeof(USER) length data and save to user array
    // user pointer can handle sizeof(USER)*user_number bytes
    size_t ret = fread(user, sizeof(USER), user_number, dat);
    // assertion for safety
    assert(ret == sizeof(USER)*user_number);

    for (int i = 0; i < user_number; i++)
    {
        fprintf(stdout, "Name: %s\nLast name: %s\nID number: %d\nPhone: 0%d\n", (user + i)->name, (user + i)->last_name, (user + i)->id_number, (user + i)->phone);
    }
}

Btw. Вы могли бы заинтересоваться, что (user + i)->name совпадает с user[i].name.

...