使用C中的文本文件的银行帐户存款选项

时间:2015-10-14 18:47:15

标签: c file edit

我试图制作一个简单的银行计划,并且我试图让存款部分工作,我使用文本文件存储帐号,帐户持有人等信息和姓氏以及帐户中的余额。

我试图在这里做的是让用户输入一个帐号,然后程序将打开名为Bank.txt的现有文件并检查是否有匹配的帐号。如果有程序将继续要求用户输入要存入的值,如果没有,那么程序将只是告诉用户该帐号不存在。

我遇到的问题是当我第一次运行程序并创建一个帐户时,一切运行正常但是一旦我关闭程序并重新打开它,它就不会在文件中找到匹配的帐号,即使它已经存在。

以下完整代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
#define SIZE 10 000
#define NAME_LEN 60
#define MAX_ACCOUNT 1000

struct bank
{
    int account_number;
    char first_name[NAME_LEN+1];
    char last_name[NAME_LEN+1];
    float accountBalance;
} enter;

void create();
/*void searchAccounts();
void viewAccounts();
void sortAccounts();
void withdraw();
void deposit();
void Account_Balance();
void Account_eliminate();
*/
int main(void)
{
    int ch;
    while(1)
        {
            printf("\t\t\t      Welcome to KTH Elektro Bank! \n \t\t     Please select your options form the menu below 1-9\n\n");
            printf("\t\t 1 : Create Account\n");
            printf("\t\t 2 : Search Accounts\n");
            printf("\t\t 3 : View Accounts\n");
            printf("\t\t 4 : Sort Accounts\n");
            printf("\t\t 5 : Deposit \n");
            printf("\t\t 6 : Withdraw \n");
            printf("\t\t 7 : Check Balance \n");
            printf("\t\t 8 : Delete Account \n");
            printf("\t\t 9 : Exit \n\n");
            printf("\t\t please enter choice : ");
            scanf("%d", &ch);
            switch(ch)
            {
               case 1: create();
                        break;
            /*  case 2: searchAccounts();
                        break;
                case 3: viewAccounts();
                        break;
                case 4: sortAccounts();
                        break;*/
                case 5: deposit();
                        break;/*
                case 6: withdraw();
                        break;
                case 7: Account_Balance();
                        break;
                case 8: Account_eliminate();
                        break;*/
                case 9: exit(0);
                        default: printf("\t\tEnter 1-9 Only");
                        getch();
            }
        }
}

void create()
{
    FILE *originalFile = fopen("Bank.txt","w");
    printf("\n\t\t Account Creation Page\n");
    printf("\t\t Enter Desired Account Number Minimum 6 Digits! : ");
        scanf("%d", &enter.account_number);
    printf("\t\t Enter Your First Name : ");
        scanf("%s",  enter.first_name);
    printf("\t\t Enter Your Last Name : ");
        scanf("%s",  enter.last_name);
    printf("\t\t Your balance is by default set to 0 KR \n\n");
        enter.accountBalance = 0;
    fprintf(originalFile,"\n Account Number : %d \n First Name : %s \n Last Name : %s \n Balance : %f", enter.account_number,enter.first_name, enter.last_name, enter.accountBalance);
    fclose(originalFile);
    getch();
}

void deposit()
{
    printf("\n\t\t Deposit Page\n");

    int acc_no;
    printf("\t\t Enter The Account Number of the Account \n\t\t You Would Like To Deposit To : ");
    scanf("%d", &acc_no);

    FILE *originalFile = fopen("Bank.txt", "r");
    FILE *newFile = fopen("BankTemp.txt", "w");
    fscanf(originalFile, "Account Number : %d", enter.account_number);
    fscanf(originalFile, "Account Holder First Name : %s", enter.first_name);
    fscanf(originalFile, "Account Holder Last Nam : %s", enter.last_name);
    fscanf(originalFile, "Balance : %f", enter.accountBalance);

    if (acc_no == enter.account_number)
    {
        float balance;
        printf("\n\t\t Enter The Amount You Would Like To Deposit : ");
        scanf("%f", &balance);
        enter.accountBalance = balance + enter.accountBalance;
        fprintf(newFile, "\n Account Number : %d \n First Name : %s \n Last Name : %s \n Balance : %f", enter.account_number, enter.first_name, enter.last_name, enter.accountBalance);
        fclose(newFile);
        fclose(originalFile);
        remove("Bank.txt");
        rename("BankTemp.txt", "Bank.txt");
    }

    if(acc_no != enter.account_number)
    {
        printf("\t\t Account Number Doesn't Exist\n");
        fclose(originalFile);
        fclose(newFile);
        remove("BankTemp.txt");
    }

}

3 个答案:

答案 0 :(得分:1)

来自人scanf,但fscanf()的工作方式类似,关于在格式字符串中指定字符时要阅读的内容:

  

普通字符(即除了空格或&#39;%&#39;之外的字符)。此字符必须与输入的下一个字符完全匹配。

例如:

fscanf(originalFile, "Account Holder First Name : %s", enter.first_name);

你在文件中没有这个确切的文字,你写了"First Name : %s \n"之类的东西。那将无法与之匹敌。

此外,如果用户名中有一些空间,则代码将无法按预期工作。我的建议是简化格式,可能是在每一行写一个数据。然后使用fgets()读取整行,并根据需要使用scanf()解析该行。

在更严肃的项目中,您可能需要考虑使用适当的数据库,甚至是sqlite。

答案 1 :(得分:1)

从评论和答案中,您的程序中可能存在多个错误(“总有一个错误!”)。我的是在更新文件时我看不到任何“追加”模式。在create()你有

FILE *originalFile = fopen("Bank.txt","w");

这将破坏您已有的文件。在deposit()中您使用单个客户创建新文件,然后删除您拥有的文件,并重命名新文件。使用

添加记录可能更好
FILE *originalFile = fopen("Bank.txt","a");

但我甚至不会这样做。我会为每个客户提供一个文件,以其帐户命名,例如10042.txt。如果客户不知道帐号,您可以在每个文件中搜索名称(和PIN?)。

答案 2 :(得分:0)

我相信你应该使用以下几行中的参考文献:

fscanf(originalFile, "Account Number : %d", enter.account_number);
fscanf(originalFile, "Account Holder First Name : %s", enter.first_name);
fscanf(originalFile, "Account Holder Last Nam : %s", enter.last_name);
fscanf(originalFile, "Balance : %f", enter.accountBalance);

以便他们阅读:

fscanf(originalFile, "Account Number : %d", &enter.account_number);
fscanf(originalFile, "Account Holder First Name : %s", enter.first_name);
fscanf(originalFile, "Account Holder Last Nam : %s", enter.last_name);
fscanf(originalFile, "Balance : %f", &enter.accountBalance);