Как я могу читать и записывать информацию о пользователе в файл со структурой - PullRequest
0 голосов
/ 01 мая 2019

Я создаю файл и хочу получать информацию от пользователей и записывать в файл или читать информацию из данных? Я хочу использовать в Switch

Код, который я использую для записи данных в файл: fwrite(&x, sizeof(struct userRec), 1, fout); fclose(fout);

Код, который я использую для записи данных в файл: fread(&x, sizeof(struct userRec), 1, fin);

Когда я пытаюсь записать некоторую информацию в файл и открываю его с помощью блокнота, я вижу только несколько символов NULL.

struct userRec{

    char firstName[25];
    char lastName[25];
    int UserID; 
    int day;
    int month;
    int year;
    char adress[200];
    float money;

};

int main(){

    struct userRec user;
    struct userRec x;
    int menu1, answer;
    char login[10];
    char answer2;
    char file_name[100];
    float deposit, withdraw;

    printf("Welcome to the IAU BANK !\n");

    printf("Please enter any character to sign in : ");
    scanf("%c",&login);

    printf("\n\n\tMENU\n1.Create User Registration\n2.Login to Account\n");
    scanf("%d",&menu1); 

    switch (menu1){

        case 1:

            printf("Please write your ID Number : ");
            scanf("%s",&file_name);
            FILE *fout;
            fout = fopen(file_name , "wb");

            printf("Please Enter Your First Name : ");
            scanf("%s",&x.firstName);

            printf("Please Enter Your Last Name : ");
            scanf("%s",&x.lastName);    

            printf("Please Enter Your Identification Number Again : ");
            scanf("%d",&x.UserID);

            printf("Please Enter Your Birthday Date (dd/mm/yyyy) Format : ");
            scanf("%d / %d / %d",&x.day,&x.month,&x.year);

            printf("Please Enter Your Adress : ");
            scanf("%s",&x.adress);

            printf("\n\n\tYour Information is :\nFirst Name : %s\nLast Name : %s \nIdentification Number : %d \nBirthday Date : %d/%d/%d\nAdress : %s",x.firstName,x.lastName,x.UserID,x.day,x.month,x.year,x.adress);

            printf("\n\n\tDo You Approve Your Information ? Yes:5 No:6 Enter 5 or 6\n");
            scanf("%d",&answer);

        case 5:

            printf("Your information has been saved!\n");

            fwrite(&user, sizeof(struct userRec), 1, fout); 
            fclose(fout);           

            printf("\nPress the 2 button to log in to your account : ");
            scanf("%d",&answer);

        case 2:

            printf("Please write your ID Number : ");
            scanf("%s",&file_name);

            FILE *fin;
            fin = fopen(file_name , "r");

            fread(&x, sizeof(struct userRec), 1, fin);

            printf("Welcome %s %s your ID : %d Your Date : %d / %d / %d Your Address : %s", x.firstName,x.lastName,x.UserID,x.day,x.month,x.year,x.adress);


            printf("\nThe amount of money in your account : %.2f",x.money);

            printf("\n\n\tMENU\n3.Deposit Money\n4.Withdraw Money\n");
            scanf("%d",&menu1);
            break;

        case 3:
            printf("Please enter the amount of money you want to deposit : ");
            scanf("%f",&deposit);

            printf("\nThe amount of money you deposit : %.2f\n", deposit);

            x.money = deposit + x.money;

            fwrite(&x, sizeof(struct userRec), 1, fout); 
            fclose(fout);
            printf("\nThe total amount of money you deposit : %.2f\n",x.money);
            break;

        case 4:

            printf("Please enter the amount of money you want to withdraw : ");
            scanf("%f",&withdraw);

    }
}

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Вы, конечно, можете сделать это, но вы действительно хотите?

Основные недостатки связаны с переносимостью файла: порядковые номера, выравнивания, размер процессора и версии

Проблема с порядком байтов заключается в том, что тип числа, который хранит более 128 или 256, должен использоватьнесколько байтов, и есть две основные схемы, в зависимости от того, хранит ли первый байт наибольшую часть числа (с прямым порядком байтов) или самую нижнюю часть (с младшим порядком байтов).Если файл хранится в одной форме на одном компьютере, его невозможно правильно прочитать на компьютере, настроенном другим способом.Большая часть мира работает на Intel или в режиме с прямым порядком байтов ARM, поэтому может показаться, что выиграл little endian, но это не всегда так.

Выравнивания - это когда компилятор выравнивает каждое из полейвашей структуры, чтобы обеспечить лучшую производительность, оставляя лишний лишний байт.Разные процессоры имеют разные правила выравнивания, поэтому файл может быть неправильно прочитан на другом процессоре или даже на одной и той же платформе с вашей программой, созданной с немного разными параметрами.

Размер процессора - это проблема, размер которой по умолчанию равенцелое число выросло за эти годы.Если бы вы сохранили файл в 1980 году, ваш int мог бы занимать всего 2 байта, так как тогда это был размер процессора int.Постепенно он вырос до 4 байтов, 8 байтов, и теперь 16-байтовый целочисленный размер не является неслыханным.Вы можете решить эту проблему, используя стандартные имена ANSI int32_t или int64_t.

Управление версиями - это проблема, которую вы создаете сами.Что произойдет через 6 месяцев, когда вы решите, что вам нужно дополнительное поле, скажем middleInitial?Как ваша новая программа сможет читать ваши старые файлы данных, а также новые файлы?Как ваша старая программа узнает, что отклонила новые данные, если встретит их?

0 голосов
/ 01 мая 2019

Попробуйте использовать файл .dat.Вы можете написать и прочитать всю структуру.https://www.google.com/amp/s/www.geeksforgeeks.org/readwrite-structure-file-c/amp/

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