Использование данных внутри двоичного файла в условном выражении - PullRequest
0 голосов
/ 27 марта 2019

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

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

Файл в двоичном формате. Моя проблема в том, что мой код для чтения файла работает нормально, если я хочу отобразить содержимое моего файла (отображаются все записи данных, которыми я заполнил файл), но когда я хочу использовать содержимое файла (поиск внутри файла для совпадения с введенным пользователем номером учетной записи) он читает только первую строку файла, таким образом, работает только первая запись данных, а последующая не читается.

Мой вопрос: что я делаю не так в моем коде? Это сбивает с толку, потому что, если я изменяю свой код для отображения содержимого, он показывает все, то есть читает весь файл. но когда я хочу найти файл с помощью условного оператора, будет прочитана только первая запись данных. Большое спасибо за ваше время

tldr: нельзя использовать данные в файле для условных выражений (проверьте данные внутри файла, потому что мой код, по-видимому, не читает их целиком, за исключением первой записи) но если я распечатываю содержимое, оно полностью читает

мои выводы 1. Мои данные ввод данных 2.Ввод учетной записи №. 1-го (желаемый выход) желаемый вывод 3. Ввод учетной записи №. 2-го (проблемная часть) проблема

мой основной код

#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<process.h>

struct account
{
    int no;
    char name[100];
    int pin;
    float id;
}; 

main()
{    
    FILE *fptr;
    fptr = fopen("accrec.dat","ab");
    if (fptr == NULL)
    {
        printf("File does not exists \n");
        return 0;
    }
    system("cls");
    struct account accrec;
    int i,tpin[4];
    char step1,ch;

    printf("\t\tWelcome to Banking System\n\t");
    printf("\nA.Open an Account\n");
    printf("\nB.Bank Transaction\n");
    printf("\nC.exit\n");

    scanf("%c",&step1);
    switch (step1)
    {

        case 'A':
            printf("Open a New Account\n");
            printf("\nEnter the following information\n");

            printf(" \n5-digit  Account number:");
            scanf("%d",&accrec.no);

            getchar();
            printf("\nAccount Name:");
            scanf("%[^\n]s",&accrec.name);

            printf("\n4-digit Account PIN:");
                /*for(i=0;i<4;i++)
                {
                ch = getch();
                tpin[4] = ch;
                ch = '*' ;
                printf("%c",ch);
                }mask works but does not allow PIN saving     */
            scanf("%d",&accrec.pin);


            printf("\nInitial deposit:");
            scanf("%f",&accrec.id);

            fwrite(&accrec,sizeof(struct account),1,fptr);

            fclose(fptr);

            break;

        case 'B':
            {
            fptr = fopen("accrec.dat","rb");
            int choice;
            int accno = 0;
            printf("Enter Your Account no.");
            scanf("%d",&accno);
            while (fread(&accrec,sizeof(account),1,fptr)!=NULL)
            {
            if(accno == accrec.no)
            {
            printf("\tWelcome to PUPQC Banking System\n");
            printf("1.Balance Inquiry\n");
            printf("2.Deposit\n");
            printf("3.Withdrawal\n");
            printf("4.quit\n");
            scanf("%d",&choice);
            }
            else 
            {
                printf("account doesn't exist\n");
                exit(1);
            }   


            fclose(fptr);

            switch (choice)
            {
                case 1:

                    printf("BALANCE INQUIRY\n");
                    printf("Current Balance:");
                    fptr = fopen("accrec.dat","rb");
                    if (fptr == NULL)
                    {
                    printf("File Cant be read");
                    exit(1);
                    }

                    printf("Account No: %d\n",accrec.no);

                    while(fread(&accrec,sizeof(struct account),1,fptr)!=NULL);
                    {
                    printf("Initial Deposit is %0.2f\n",accrec.id);
                    }       
                    printf("%d\n",&accrec.id);

                    break;

                case 2:
                    float dv;
                    printf("DEPOSIT\n");
                    printf("Current Balance:");
                    fptr = fopen("accrec.dat","rb");
                    if (fptr == NULL)
                    {
                    printf("File Cant be read");
                    exit(1);
                    }
                    while(fread(&accrec,sizeof(struct account),1,fptr)!=NULL);
                    {
                    printf("%0.2f\n",accrec.id);
                    }
                    printf("Enter amount to deposit:\n");
                    printf("Deposit Value:");
                    scanf("%0.2f",&dv);
                    accrec.id = accrec.id + dv; 
                    fwrite(&accrec,sizeof(struct account),1,fptr);  
                    fclose(fptr);
                    break;

                case 3:
                    float wv;
                    printf("WITHDRAWAL\n");
                    printf("Current Balance:");
                    fptr = fopen("accrec.dat","rb+");
                    if (fptr == NULL)
                    {
                    printf("File Cant be read");
                    exit(1);
                    }
                    while(fread(&accrec,sizeof(struct account),1,fptr)!=NULL);
                    {
                    printf("%0.2f\n",accrec.id);
                    }
                    printf("Enter amount to withdraw:\n");
                    printf("Withdrawal Value:");
                    scanf("%0.2f",wv);
                    accrec.id = accrec.id - wv; 
                    fwrite(&accrec,sizeof(struct account),1,fptr);  
                    fclose(fptr);

                    break;

                case 4:
                    printf("thank you for your patronage \n");
                    return 0;
                    break;

                default:
                    printf("error 404");
                    break;
                }
            }
        }
        break;

        case 'C':
            printf("Thank you! Have a good day");
            return 0;
            break;

        case 'D':
            fptr = fopen("accrec.dat","rb");
            if (fptr == NULL)
            {
                printf("File Cant be read");
                exit(1);
            }

            printf("Data From file\n");

            while(fread(&accrec,sizeof(struct account),1,fptr)!=NULL)
            printf("\n acc.no is %d\n acc.name is %s\n PIN %d\n Initial Deposit is %0.2f\n ",accrec.no,accrec.name,accrec.pin,accrec.id);
            fclose(fptr);
            getch();

            break;

        default:
            printf("invalid input! please select form the options given\n");

    }

} 

моя структура

    struct account
    {
        int no;
        char name[100];
        int pin;
        float id;
    }; 

код для поиска совпадения номера счета в моем файле (часть, с которой у меня проблемы)

    fptr = fopen("accrec.dat","rb");
    int choice;
    int accno = 0;
    printf("Enter Your Account no.");
    scanf("%d",&accno);
    while (fread(&accrec,sizeof(account),1,fptr)!=NULL)
    {
        if (accno == accrec.no)
        {
            printf("\tWelcome to Banking System\n");
            printf("1.Balance Inquiry\n");
            printf("2.Deposit\n");
            printf("3.Withdrawal\n");
            printf("4.quit\n");

            scanf("%d",&choice);
        }
        else 
        {
            printf("account doesn't exist\n");
            exit(1);
        }   
    }

    fclose(fptr);

Ожидаемый вывод - мой условный оператор работает правильно и читает весь файл на совпадения.

1 Ответ

3 голосов
/ 27 марта 2019

попытайтесь изменить exit(1) на continue;, exit(1) заставит вашу программу выйти из цикла while и немедленно выйти из программы всякий раз, когда accno != accrec.no.

на самом деле вам не нужен оператор else внутри цикла while, вы должны поместить его вне цикла while. например:

scanf("%d",&accno);
boolean found = false;
while (fread(&accrec,sizeof(account),1,fptr)!=NULL)
{
    if (accno == accrec.no)
    {
        found = true;
        scanf("%d",&acpin);*/
        printf("\tWelcome to Banking System\n");
        printf("1.Balance Inquiry\n");
        printf("2.Deposit\n");
        printf("3.Withdrawal\n");
        printf("4.quit\n");

        scanf("%d",&choice);
    }
}
if (!found) {
    printf("account doesn't exist\n");
}

fclose(fptr);
...