DB Program in C

File Name Banking.c


 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define DB_FILE "bank_data.txt"
#define TEMP_FILE "bank_temp.txt"

#define MAX_NAME 50
#define MAX_ACCOUNTS 100

typedef struct
{
    int accountNo;
    char name[MAX_NAME];
    double balance;
    int active;
} Account;


/* ---------------------------------------------------------
   UTILITY FUNCTIONS
   --------------------------------------------------------- */

void clearInputBuffer()
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
}


void getDateTime(char *buffer, int size)
{
    time_t now = time(NULL);
    struct tm *t = localtime(&now);

    strftime(buffer, size, "%Y-%m-%d %H:%M:%S", t);
}


/* ---------------------------------------------------------
   DATABASE - LOAD ACCOUNTS
   --------------------------------------------------------- */

int loadAccounts(Account accounts[])
{
    FILE *file;
    int count = 0;

    file = fopen(DB_FILE, "r");

    if (file == NULL)
    {
        return 0;
    }

    while (fscanf(file, "%d|%49[^|]|%lf|%d\n",
                  &accounts[count].accountNo,
                  accounts[count].name,
                  &accounts[count].balance,
                  &accounts[count].active) == 4)
    {
        count++;

        if (count >= MAX_ACCOUNTS)
            break;
    }

    fclose(file);

    return count;
}


/* ---------------------------------------------------------
   DATABASE - SAVE ACCOUNTS
   --------------------------------------------------------- */

int saveAccounts(Account accounts[], int count)
{
    FILE *file;

    file = fopen(DB_FILE, "w");

    if (file == NULL)
    {
        printf("\nERROR: Cannot open database file.\n");
        return 0;
    }

    for (int i = 0; i < count; i++)
    {
        fprintf(file, "%d|%s|%.2lf|%d\n",
                accounts[i].accountNo,
                accounts[i].name,
                accounts[i].balance,
                accounts[i].active);
    }

    fclose(file);

    return 1;
}


/* ---------------------------------------------------------
   FIND ACCOUNT
   --------------------------------------------------------- */

int findAccount(Account accounts[], int count, int accountNo)
{
    for (int i = 0; i < count; i++)
    {
        if (accounts[i].accountNo == accountNo &&
            accounts[i].active == 1)
        {
            return i;
        }
    }

    return -1;
}


/* ---------------------------------------------------------
   TRANSACTION LOG
   --------------------------------------------------------- */

void logTransaction(int accountNo,
                    const char *type,
                    double amount,
                    double balance,
                    const char *status)
{
    FILE *file;
    char datetime[50];

    getDateTime(datetime, sizeof(datetime));

    file = fopen("transactions.txt", "a");

    if (file == NULL)
    {
        printf("WARNING: Transaction log could not be written.\n");
        return;
    }

    fprintf(file,
            "%s|Account:%d|Type:%s|Amount:%.2lf|Balance:%.2lf|Status:%s\n",
            datetime,
            accountNo,
            type,
            amount,
            balance,
            status);

    fclose(file);
}


/* ---------------------------------------------------------
   GENERATE ACCOUNT NUMBER
   --------------------------------------------------------- */

int generateAccountNumber(Account accounts[], int count)
{
    int max = 1000;

    for (int i = 0; i < count; i++)
    {
        if (accounts[i].accountNo > max)
            max = accounts[i].accountNo;
    }

    return max + 1;
}


/* ---------------------------------------------------------
   CREATE ACCOUNT
   --------------------------------------------------------- */

void createAccount()
{
    Account accounts[MAX_ACCOUNTS];

    int count = loadAccounts(accounts);

    if (count >= MAX_ACCOUNTS)
    {
        printf("\nBank database is full.\n");
        return;
    }

    Account newAccount;

    newAccount.accountNo =
        generateAccountNumber(accounts, count);

    printf("\nEnter customer name: ");

    clearInputBuffer();

    fgets(newAccount.name,
          MAX_NAME,
          stdin);

    newAccount.name[
        strcspn(newAccount.name, "\n")
    ] = '\0';

    newAccount.balance = 0.0;
    newAccount.active = 1;

    accounts[count] = newAccount;

    if (saveAccounts(accounts, count + 1))
    {
        printf("\n================================\n");
        printf("ACCOUNT CREATED SUCCESSFULLY\n");
        printf("Account Number : %d\n",
               newAccount.accountNo);
        printf("Customer Name  : %s\n",
               newAccount.name);
        printf("Balance        : %.2lf\n",
               newAccount.balance);
        printf("================================\n");

        logTransaction(
            newAccount.accountNo,
            "CREATE_ACCOUNT",
            0,
            newAccount.balance,
            "SUCCESS"
        );
    }
}


/* ---------------------------------------------------------
   DEPOSIT
   --------------------------------------------------------- */

void deposit()
{
    Account accounts[MAX_ACCOUNTS];

    int count = loadAccounts(accounts);

    int accountNo;
    double amount;

    printf("\nEnter account number: ");
    scanf("%d", &accountNo);

    int index =
        findAccount(accounts, count, accountNo);

    if (index == -1)
    {
        printf("\nAccount not found.\n");

        logTransaction(
            accountNo,
            "DEPOSIT",
            0,
            0,
            "FAILED_ACCOUNT_NOT_FOUND"
        );

        return;
    }

    printf("Enter deposit amount: ");
    scanf("%lf", &amount);

    if (amount <= 0)
    {
        printf("\nInvalid amount.\n");

        logTransaction(
            accountNo,
            "DEPOSIT",
            amount,
            accounts[index].balance,
            "FAILED_INVALID_AMOUNT"
        );

        return;
    }

    double oldBalance =
        accounts[index].balance;

    accounts[index].balance += amount;

    if (saveAccounts(accounts, count))
    {
        printf("\nDeposit successful.\n");
        printf("Old Balance : %.2lf\n", oldBalance);
        printf("Deposit     : %.2lf\n", amount);
        printf("New Balance : %.2lf\n",
               accounts[index].balance);

        logTransaction(
            accountNo,
            "DEPOSIT",
            amount,
            accounts[index].balance,
            "SUCCESS"
        );
    }
    else
    {
        /*
           ROLLBACK IN MEMORY
        */

        accounts[index].balance =
            oldBalance;

        printf("\nTransaction failed.\n");
        printf("Rollback performed.\n");

        logTransaction(
            accountNo,
            "DEPOSIT",
            amount,
            oldBalance,
            "FAILED_ROLLBACK"
        );
    }
}


/* ---------------------------------------------------------
   WITHDRAW
   --------------------------------------------------------- */

void withdraw()
{
    Account accounts[MAX_ACCOUNTS];

    int count = loadAccounts(accounts);

    int accountNo;
    double amount;

    printf("\nEnter account number: ");
    scanf("%d", &accountNo);

    int index =
        findAccount(accounts, count, accountNo);

    if (index == -1)
    {
        printf("\nAccount not found.\n");
        return;
    }

    printf("Enter withdrawal amount: ");
    scanf("%lf", &amount);

    if (amount <= 0)
    {
        printf("\nInvalid amount.\n");
        return;
    }

    if (amount > accounts[index].balance)
    {
        printf("\nTransaction FAILED.\n");
        printf("Insufficient balance.\n");

        logTransaction(
            accountNo,
            "WITHDRAW",
            amount,
            accounts[index].balance,
            "FAILED_INSUFFICIENT_BALANCE"
        );

        return;
    }

    double oldBalance =
        accounts[index].balance;

    accounts[index].balance -= amount;

    if (saveAccounts(accounts, count))
    {
        printf("\nWithdrawal successful.\n");
        printf("Withdrawn   : %.2lf\n", amount);
        printf("New Balance : %.2lf\n",
               accounts[index].balance);

        logTransaction(
            accountNo,
            "WITHDRAW",
            amount,
            accounts[index].balance,
            "SUCCESS"
        );
    }
    else
    {
        accounts[index].balance =
            oldBalance;

        printf("\nWithdrawal failed.\n");
        printf("ROLLBACK performed.\n");
    }
}


/* ---------------------------------------------------------
   CHECK BALANCE
   --------------------------------------------------------- */

void checkBalance()
{
    Account accounts[MAX_ACCOUNTS];

    int count = loadAccounts(accounts);

    int accountNo;

    printf("\nEnter account number: ");
    scanf("%d", &accountNo);

    int index =
        findAccount(accounts, count, accountNo);

    if (index == -1)
    {
        printf("\nAccount not found.\n");
        return;
    }

    printf("\n------------------------------\n");
    printf("ACCOUNT DETAILS\n");
    printf("------------------------------\n");
    printf("Account No : %d\n",
           accounts[index].accountNo);
    printf("Name       : %s\n",
           accounts[index].name);
    printf("Balance    : %.2lf\n",
           accounts[index].balance);
    printf("------------------------------\n");
}


/* ---------------------------------------------------------
   TRANSFER MONEY
   --------------------------------------------------------- */

void transferMoney()
{
    Account accounts[MAX_ACCOUNTS];

    int count = loadAccounts(accounts);

    int fromAccount;
    int toAccount;
    double amount;

    printf("\nEnter sender account: ");
    scanf("%d", &fromAccount);

    printf("Enter receiver account: ");
    scanf("%d", &toAccount);

    printf("Enter amount: ");
    scanf("%lf", &amount);

    int sender =
        findAccount(accounts, count, fromAccount);

    int receiver =
        findAccount(accounts, count, toAccount);

    if (sender == -1 || receiver == -1)
    {
        printf("\nTRANSFER FAILED.\n");
        printf("Invalid sender or receiver.\n");
        return;
    }

    if (fromAccount == toAccount)
    {
        printf("\nCannot transfer to same account.\n");
        return;
    }

    if (amount <= 0)
    {
        printf("\nInvalid amount.\n");
        return;
    }

    if (accounts[sender].balance < amount)
    {
        printf("\nTRANSFER FAILED.\n");
        printf("Insufficient sender balance.\n");
        return;
    }

    /*
       Save old values.
       These values are required for rollback.
    */

    double oldSenderBalance =
        accounts[sender].balance;

    double oldReceiverBalance =
        accounts[receiver].balance;

    /*
       STEP 1
       Debit sender
    */

    accounts[sender].balance -= amount;

    /*
       STEP 2
       Credit receiver
    */

    accounts[receiver].balance += amount;

    /*
       STEP 3
       Save complete database
    */

    if (saveAccounts(accounts, count))
    {
        printf("\n================================\n");
        printf("TRANSFER SUCCESSFUL\n");
        printf("From Account : %d\n", fromAccount);
        printf("To Account   : %d\n", toAccount);
        printf("Amount       : %.2lf\n", amount);
        printf("================================\n");

        logTransaction(
            fromAccount,
            "TRANSFER_OUT",
            amount,
            accounts[sender].balance,
            "SUCCESS"
        );

        logTransaction(
            toAccount,
            "TRANSFER_IN",
            amount,
            accounts[receiver].balance,
            "SUCCESS"
        );
    }
    else
    {
        /*
           TRANSACTION FAILED

           ROLLBACK BOTH ACCOUNTS
        */

        accounts[sender].balance =
            oldSenderBalance;

        accounts[receiver].balance =
            oldReceiverBalance;

        printf("\nTRANSFER FAILED.\n");
        printf("ROLLBACK COMPLETED.\n");
    }
}


/* ---------------------------------------------------------
   CLOSE ACCOUNT
   --------------------------------------------------------- */

void closeAccount()
{
    Account accounts[MAX_ACCOUNTS];

    int count = loadAccounts(accounts);

    int accountNo;

    printf("\nEnter account number: ");
    scanf("%d", &accountNo);

    int index =
        findAccount(accounts, count, accountNo);

    if (index == -1)
    {
        printf("\nAccount not found.\n");
        return;
    }

    if (accounts[index].balance != 0)
    {
        printf("\nAccount cannot be closed.\n");
        printf("Balance must be 0.\n");
        return;
    }

    accounts[index].active = 0;

    if (saveAccounts(accounts, count))
    {
        printf("\nAccount closed successfully.\n");

        logTransaction(
            accountNo,
            "CLOSE_ACCOUNT",
            0,
            0,
            "SUCCESS"
        );
    }
}


/* ---------------------------------------------------------
   DISPLAY ALL ACCOUNTS
   --------------------------------------------------------- */

void displayAllAccounts()
{
    Account accounts[MAX_ACCOUNTS];

    int count = loadAccounts(accounts);

    printf("\n");
    printf("=================================================\n");
    printf("                 ALL ACCOUNTS\n");
    printf("=================================================\n");

    printf("%-10s %-25s %-12s %-10s\n",
           "Account",
           "Name",
           "Balance",
           "Status");

    printf("-------------------------------------------------\n");

    for (int i = 0; i < count; i++)
    {
        printf("%-10d %-25s %-12.2lf %-10s\n",
               accounts[i].accountNo,
               accounts[i].name,
               accounts[i].balance,
               accounts[i].active
                   ? "ACTIVE"
                   : "CLOSED");
    }

    printf("=================================================\n");
}


/* ---------------------------------------------------------
   TRANSACTION HISTORY
   --------------------------------------------------------- */

void transactionHistory()
{
    FILE *file;

    file = fopen("transactions.txt", "r");

    if (file == NULL)
    {
        printf("\nNo transaction history found.\n");
        return;
    }

    char line[500];

    printf("\n============================================\n");
    printf("          TRANSACTION HISTORY\n");
    printf("============================================\n");

    while (fgets(line, sizeof(line), file))
    {
        printf("%s", line);
    }

    fclose(file);
}


/* ---------------------------------------------------------
   MAIN MENU
   --------------------------------------------------------- */

int main()
{
    int choice;

    do
    {
        printf("\n\n");
        printf("============================================\n");
        printf("             MINI BANKING SYSTEM\n");
        printf("============================================\n");

        printf("1. Create Account\n");
        printf("2. Deposit Money\n");
        printf("3. Withdraw Money\n");
        printf("4. Check Balance\n");
        printf("5. Transfer Money\n");
        printf("6. Close Account\n");
        printf("7. Display All Accounts\n");
        printf("8. Transaction History\n");
        printf("9. Exit\n");

        printf("============================================\n");

        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice)
        {
            case 1:
                createAccount();
                break;

            case 2:
                deposit();
                break;

            case 3:
                withdraw();
                break;

            case 4:
                checkBalance();
                break;

            case 5:
                transferMoney();
                break;

            case 6:
                closeAccount();
                break;

            case 7:
                displayAllAccounts();
                break;

            case 8:
                transactionHistory();
                break;

            case 9:
                printf("\nThank you for using the banking system.\n");
                break;

            default:
                printf("\nInvalid choice.\n");
        }

    } while (choice != 9);

    return 0;
}





bank_data.txt

1001|Rahul Sharma|25000.00|1
1002|Priya Singh|18000.00|1
1003|Aman Kumar|5000.00|1
1004|Neha Gupta|35000.00|1
1005|Rohan Verma|0.00|0
1006|Livesh|500.00|1



transactions.txt

Auto crate and fill

Comments

Popular posts from this blog

C API Client Project