我试图制作一个简单的银行计划,并且我试图让存款部分工作,我使用文本文件存储帐号,帐户持有人等信息和姓氏以及帐户中的余额。
我试图在这里做的是让用户输入一个帐号,然后程序将打开名为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");
}
}
答案 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);