簡體   English   中英

在條件語句中使用二進制文件中的數據

[英]Using data inside a binary file in a conditional statement

這是我第一次在這里問問題,所以對不起,如果我的帖子有點亂,我要先抱歉。 我是一名新生,我的決賽是進行atm程序。

我的程序使用switch語句作為選項:第一個詢問用戶的信息(帳號,帳戶名,PIN,初始存款),第二個詢問實際交易:余額檢查,存款和取款。 當然,在您可以執行這些選項中的任何一個之前,我必須檢查信息(在這種情況下,帳號和PIN)是否與我的文件中的信息匹配。

該文件為二進制文件。 我的問題是,如果我想顯示文件的內容(顯示了填充文件的所有數據條目),但是我想使用文件的內容(搜索時),則用於讀取文件的代碼可以正常工作在文件中查找與用戶輸入的帳號匹配的文件),它僅讀取文件的第一行,因此僅第一個數據條目有效,而后面的數據則不被讀取。

我的問題是,我的代碼在做什么錯? 它令人困惑,因為如果我更改代碼以顯示內容,它將顯示所有內容,這意味着它將讀取整個文件。 但是當我想使用條件語句搜索文件時,僅讀取第一個數據條目。 非常感謝您的寶貴時間

tldr:不能使用文件中的數據作為條件文件(驗證文件中的數據,因為我的代碼除了第一個條目以外,顯然沒有完整地讀取它),但是如果我打印內容,它將完全讀取它

我的輸出1.我的數據條目數據條目 2.輸入帳號。 輸入第一個(所需的輸出) 所需輸出 3。 第二個(問題部分) 問題

我的主要代碼

#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);

預期的輸出是我的條件語句正常工作,並讀取我的整個文件以進行匹配。

嘗試將exit(1)更改為continue; exit(1)將使您的程序退出while循環,並在accno != accrec.no時立即退出程序。

實際上,您不需要在while循環內使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM