0

私はこのコーディングを下に持っています(顧客管理のみを投稿するだけです)。

これは、通過するたびに顧客を追加するデータベースです。次に、クライアントIDであるc.IDが存在するかどうかを確認する必要があります。

searchIDというメソッドを試してみました。このメソッドは、見つかった場合は1を返し、見つからなかった場合は-1を返します。問題は、プログラムを実行しようとすると、プログラムが文字通りそこにハングすることです。23を押しても「ENTER」を押しても何も起こらず、CTRL+Cを使用して終了する必要があります。

だからこれはそれがどのように機能するかです:

顧客(構造体)を追加すると、ファイルに保存されますが、最初にIDがデータベースに存在するかどうかを確認する必要があります。そうでない場合は、ユーザーに別のIDを入力するか、メインメニューに戻るように依頼する必要があります。

何か提案をお願いします?? ありがとうございました

#include<io.h>
#include<fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include "..\Headers\common.h"
#include "..\Headers\customerManagement.h"

static FILE *cfp;
static customer c;
#define STRUCTSIZE sizeof (customer)


/** This is the Customers's Main Menu in which the various sections can be
 *  accessed from here
 */
boolean  customerMainMenu()
{



    int optionC;
    clrscr();

    copyright();


    printf ("\n\n\n\n\t\t    ************* Customer's Main Menu *************\n \n \n");

    printf ("Press [1] to add a new Customer\n");
    printf ("Press [2] to edit a Customer\n");
    printf ("Press [3] to list all Customers\n");
    printf ("Press [4] to Show a Customer's last Order\n");
    printf ("Press [5] to go back to Main Menu\n\n\n");


    if (scanf ("%d",&optionC) == 1)
    {
        switch (optionC)
        {

        case 1:
        {
            clrscr();
            getchar();
            addCustomer();
            break;
        }
        case 2:
        {
            printf ("Edit a Customer\n");
            break;
        }

        case 3:
        {
            clrscr();
            listCustomers();
            getchar();
            while (getchar()!='\n')
            {

            }
            break;
        }
        case 4:
        {
            printf ("Customer's Last Order\n");
            break;
        }
        case 5:
        {
            system ("PAUSE");
            break;
        }
        default:
        {
            if (optionC != 1 || optionC != 2 || optionC != 3 || optionC != 4 || optionC !=5)
            {
                clrscr();
                printf ("Invalid option!\n");
                system ("PAUSE");
                customerMainMenu();
            }
            break;
        }
        }
    }
    return TRUE;

}

/**
 *  This following method will append a customer to the
 *  database at the end of the file
 *
 *  */

void addCustomer ()
{
    char ch;
    copyright();

    printf ("\n\n\n\n\t\t    ************* Add Client **********\n \n \n");

    if ((cfp = fopen ("customers.dat","a+b")) == NULL)
    {
        fputs("Can't open customers.dat file\n",stderr);
    }



    printf ("\tThis will add another customer to the the database\n");
    printf ("\tPress 'Y' to confirm or 'N' to return to the Client Main Menu\n\tWITHOUT adding a customer\n");
    ch = getchar();

    if (ch == 'n' || ch == 'N')
    {
        customerMainMenu();
    }
    else if (ch == 'y' || ch == 'Y')
    {

        clrscr();
        printf ("\n\n\n\n\t\t    ************* Add Client **********\n \n \n");
        printf ("Please enter Name:\n");
        while (scanf ("%s", c.name) == 0 || cCheck(c.name,100) == FALSE);
        {

        }


        printf ("Please Enter Surname: \n");
        while (scanf ("%s",c.surname) == 0 && cCheck (c.surname,100) == FALSE);
        {

        }

        printf ("Please Enter ID Card, [NOTE! Only numbers are allowed!]\n");
        int cID;
        cID = 0;
        while (scanf ("%d",&cID)==0)
        {
            printf ("Only Numbers are allowed!\n");
            while (getchar() != '\n')
            {
            }
        }

        if (searchID(cID) == 1)
        {
            printf ("This ID already exists. Client already exists!\n");
            printf ("Do you want to input another ID or return to Main Menu?\n");
            printf ("Press 'Y' if you enter another ID, press any other key to return to Main Menu\n:");

            ch = getchar();
            if (ch == 'y' || ch == 'Y')
            {
                printf ("Enter another ID:\n");
                while (scanf ("%d",&cID)==0)
                    {
                        printf ("Only Numbers are allowed!\n");
                        while (getchar() != '\n')
                        {
                        }
                    }
                searchID(cID);
            }
            else if (searchID(cID) == -1)
            {
                cID = c.ID;
                getchar();
            }

        }



        while (getchar()!='\n')
        {

        }

        printf ("Please Enter Address:\n");
        gets(c.address);


        fwrite (&c,STRUCTSIZE, 1, cfp);

        printf ("For Testing purposes:\n");
        printf (" %s\n %s\n %s\n %d\n", c.name, c.surname, c.address, c.ID);
        askAnother();


    }
    else
    {
        printf ("\nInvalid choice! Either Y or N is accepted\n");
        system ("PAUSE");
        getchar();
        addCustomer();
    }
}

void listCustomers()
{

    if ((cfp = fopen ("customers.dat","rb")) == NULL)
    {
        fputs("Can't open customers.dat file\n",stderr);
        printf ("Returning to Customer Main Menu");
        system ("PAUSE");
        customerMainMenu();
    }

    rewind (cfp);

    while (fread (&c,STRUCTSIZE,1,cfp)==1)
    {
        printf ("Customer: %s %s ID: %d\n", c.surname, c.name, c.ID);
    }
    fclose (cfp);
    //  system ("PAUSE");

}


void askAnother()
{
    printf ("Do you want to add another Customer?\n");
    printf ("Enter 'Y' for yes and 'N' to return to the Main Menu\n");

    char input;
    input = getchar();

    if (input == 'Y' || input == 'y')
    {
        getchar();
        addCustomer();
    }
    else if (input == 'N'|| input == 'n')
    {

        fclose (cfp);
        customerMainMenu();

    }
    else
    {
        printf ("Invalid Option! Only Y or N are allowed\n");
        system ("PAUSE");
        askAnother();

    }

}


boolean cCheck(char *test, int max)
{
    int x;
    for (x =0; x<max; x++)
    {
        if (isdigit(test[x]))
        {
            return FALSE;
        }
        if (x==max)
        {
            return TRUE;
        }
        x++;

    }
    return TRUE;
}

int fileSize()
{
    int lengthOfFile;
    int file;

    file = open("Customers.dat",O_RDONLY,0);
    lengthOfFile = lseek (file,0, SEEK_END);

    return lengthOfFile;
}

int getNoOfRecords()
{
    return (fileSize()/(STRUCTSIZE));
}

/**
 *  This method will compare the ID passed from the ID of the customer to check
 *  whether it is exists or not. If it exists it will output 1 otherwise it
 *  will output -1. This will make sure that the Person's ID is unique
 *
 */

int searchID (int cID)
{
    // for the while loop
    int index;
    index = 0;
    //gets the number of records currently held in the file.
    int records;
    records = getNoOfRecords();

    //User will input the ID into this variable and it will be checked
    //whether it exists or not


    int IDstatus;
    IDstatus = 0;

    while (index != records)
        {
            fread (&c,STRUCTSIZE,1,cfp);
            if (c.ID == cID)
            {
                IDstatus = 1;
            }
            else
            {
                IDstatus = -1;
            }
        }

    return IDstatus;

}

編集:

2つのことがあります:

現在0であるIDが2つあるにもかかわらず、メソッドはSearchID()メソッドを機能させていません。

または、0のままであるc.IDのため。

データを入力しているときは受け入れていますが、レコード全体を出力しようとすると、クライアントIDは0のままです。

それに加えて、0の2つのIDを使用できるようになっているため、おそらくメソッドが機能していません。これまでのすべての支援に感謝します。

4

1 に答える 1

2

インデックスをインクリメントできませんでした。もちろん、IDが見つかったらループを終了する必要があります。

while (index != records)
    {
        fread (&c,STRUCTSIZE,1,cfp);
        if (c.ID == cID)
        {
            IDstatus = 1;
            break; // <<<< otherwise IDStatus will be overwritten by next iteration
        }
        else
        {
            IDstatus = -1;
        }
        index++; // <<< otherwise endless loop
    }
于 2012-12-20T18:55:57.883 に答える