在文件中追加多条记录的问题

problem in appending multiple records in a file

我在向该文件追加更多记录时遇到问题。它只允许我添加一条记录,但我不能添加多条记录。并且无法弄清楚它出了什么问题?

void new_customer()
{
    char ch;
    int flag=0;
    FILE *fp;
    fp=fopen("DataFile.txt", "a+");

    printf("Enter today's date (dd/mm/yyyy) : ");
    scanf(" %d/%d/%d", &add.deposit.day, &add.deposit.month, &add.deposit.year);

    printf("Enter Account Number :  ");
    fflush(stdin);
    scanf("%ld", &check.account_number);

    while(fscanf(fp, "%ld %s %s %s %s %s %d %d/%d/%d %d %d/%d/%d %c", &add.account_number, add.customer_name, add.father_name, add.address, add.Nationality, &add.p_number, &add.age, &add.dob.day, &add.dob.month, &add.dob.year, &add.amount, &add.deposit.day, &add.deposit.month, &add.deposit.year, &add.account_type)!=EOF)
    {
        if(check.account_number==add.account_number)
            {
                printf("Account number already taken. Please contact administrator.\nPress enter to continue.");
                getch();
                system("cls");
                main();
            }
    }

    add.account_number=check.account_number;
    printf("Enter name : ");
    fflush(stdin);
    gets(add.customer_name);

    printf("Enter Father's name : ");
    fflush(stdin);
    gets(add.father_name);

    printf("Enter your age : ");
    fflush(stdin);
    scanf("%d", &add.age);

    printf("Enter Date of birth (dd/mm/yyyy) : ");
    scanf("%d/%d/%d", &add.dob.day, &add.dob.month, &add.dob.year);

    printf("Enter Phone Number : ");
    fflush(stdin);
    gets(add.p_number);

    printf("Enter Nationality : ");
    fflush(stdin);
    gets(add.Nationality);

    printf("Enter Address : ");
    fflush(stdin);
    gets(add.address);

    printf("Enter Account Type:\nPress S for Savings, \nPress C for Current, \nF for Fixed : ");
    fflush(stdin);
    scanf("%c",&add.account_type);

    while(flag!=1)
    {
        if (add.account_type=='S'|| add.account_type=='s'||add.account_type=='C'||add.account_type=='c'||add.account_type=='F'||add.account_type=='f')
        {
            flag=1;
        }
        else
        {
            printf("\nWrong Input. Input Again : ");
            fflush(stdin);
            scanf("%c", &add.account_type);
            flag=0;
        }
    }

    printf("Deposit Amount : ");
    fflush(stdin);
    scanf("%d", &add.amount);

    fprintf(fp, "%ld %s %s %s %s %s %d %d/%d/%d %d %d/%d/%d %c\n", add.account_number, add.customer_name, add.father_name, add.address, add.Nationality, add.p_number, add.age, add.dob.day, add.dob.month, add.dob.year, add.amount, add.deposit.day, add.deposit.month, add.deposit.year, add.account_type);
    printf("\nAccount Created Successfully!!\n");
    fclose(fp);

    while(1)
    {
        printf("Return to Main Menu? Y/N : ");
        fflush(stdin);
        scanf("%c", &ch);
        if(ch=='Y' || ch=='y')
        {
            system("cls");
            main();
        }
        else if(ch=='N' || ch=='n')
        {
            exit(0);
        }
        else

        {
        printf("\nWrong input. Try Again!\n");
        }
    }
}

这只是一个大程序的功能。我只附上包括文件处理的部分。如果你想要我可以附上更多代码。

这里我添加主要的驱动代码

#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include "E:\Projects\C Language\Bank-Management-System\File Containing Functions.c"

int menu(void);
int gotoxy(int x, int y)
{
    COORD c;
    c.X=x;
    c.Y=y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

int menu()
{
    int i, a;
    gotoxy(40,0);
    printf("BANK MANAGEMENT SYSTEM\n");

    gotoxy(43, 3);
    printf(":: MAIN MENU ::\n");

    gotoxy(40, 5);
    printf("[1] Create a new account");
    gotoxy(40, 6);
    printf("[2] Update information of existing account");
    gotoxy(40, 7);
    printf("[3] Transactions");
    gotoxy(40, 8);
    printf("[4] Check details of existing account");
    gotoxy(40, 9);
    printf("[5] Remove existing account");
    gotoxy(40, 10);
    printf("[6] View Customer List");
    gotoxy(40, 11);
    printf("[7] Exit\n");

    gotoxy(40, 15);
    printf("Enter your choice : ");
    scanf("%d", &a);
    return a;
}

int main()
{
    int choice;
    choice=menu();
    switch(choice)
    {
        case 1:
            {
                system("cls");
                new_customer();
                break;
            }
        case 3:
            {
                system("cls");
                transaction();
                break;
            }

        case 7 :
            {
                system("cls");
                printf("Thank You for using our services!!");
                exit(0);
            }
        default:
            {
                printf("Wrong Input!!\n");
                getch();
                system("cls");
                menu();
            }
    }
    getch();
    return 0;
}

Link 查看输入:https://pasteboard.co/Jt3xWrP.jpg 这是第一次输入后的文件:https://pasteboard.co/Jt3yYA9.jpg 另一个输入:https://pasteboard.co/Jt3yHSC.jpg(这是它永远卡住的地方,不允许我添加另一条记录)

文件中存储的文本: 123 John Papa John 15, Yemen Road, Yemen USA 12345678 22 11/2/0 2000 27/9/2020 S

所以从文件开始:

123 John Papa John 15, Yemen Road, Yemen USA 12345678 22 11/2/0 2000 27/9/2020 S

然后你尝试用

扫描它
fscanf(fp, "%ld %s %s %s %s %s %d %d/%d/%d %d %d/%d/%d %c"

即:

1 number
5 strings
1 number
...

如您所见,文件与那个不匹配。

123 John Papa John 15, Yemen Road, Yemen USA 12345678 22 11/2/0 2000 27/9/2020 S
^^^ ^^^  ^^^  ^^^  ^^^ ^^^   ^^^
ok  ok   ok   ok   ok  ok    Not ok, so stop here

下一个 fscanf 将不匹配任何内容(它需要一个数字,但文件中包含“Road”),因此不会读取任何内容。

换句话说,你永远困在while中。

我建议使用 fgets.

逐行阅读文件

然后你可以(原则上)在之后使用sscanf。但请注意 %s 读取 一个单词 并且您的代码允许单个条目包含多个单词!换句话说 - 您的文件无法使用 %s.

进行解析

所以考虑另一种文件格式。例如,您可以为记录中的每个项目使用 1 行。这将使解析更容易。