2015-10-14 3 views
0

Я пытаюсь создать простую банковскую программу, и я пытаюсь получить часть депозита для работы, я использую текстовый файл для хранения информации, такой как номер учетной записи, имя и фамилия владельца счета и баланс на счете.Вариант депозита банковского счета с использованием текстового файла в C

Я пытаюсь сделать здесь, чтобы заставить пользователя ввести номер учетной записи, который затем откроет существующий файл 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"); 
    } 

} 
+4

Добавить много результатов регистрации в вашу программу, чтобы вы могли видеть, где это происходит. Или используйте отладчик. –

ответ

1

От человека scanf, но fscanf() работает так же, о том, что читать, когда символ указан в строке формата:

обычный символ (т.е. кроме пробела или «%»). Этот символ должен точно соответствовать следующему символу ввода.

, когда вы делаете, например:

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

вы не имеете именно этот текст в файле, Вы писали что-то вроде "First Name : %s \n". И это не будет соответствовать.

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

В более серьезных проектах вы можете рассмотреть возможность использования соответствующей базы данных или даже sqlite.

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

Из комментариев и ответов есть, вероятно, severals ошибки в программе (» всегда есть еще одна ошибка! »). Моя заключается в том, что я не вижу никакого режима «добавления» при обновлении файла. В create() у вас есть

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

Это уничтожит файл, который вы уже имеете. В deposit() Вы создаете новый файл с одним клиентом, затем удаляете файл, который у вас есть, и переименовываете новый. Может быть, стоит добавить запись с

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

Но я бы даже не сделал этого. У меня будет один файл для каждого клиента, названный его учетной записью, скажем 10042.txt. Если клиент не знает номер учетной записи, вы можете выполнить поиск в каждом файле для имени (и PIN-кода?).

+0

Вам лучше иметь другой файл, который связывает клиентов и их имена/имена файлов (например, словарь), если у вас много учетных записей, это будет быстрее, чем открытие каждого файла –

Смежные вопросы