1

私は注文のデータベースを作成しています。この場合、トランザクションを処理します。

手順は次のとおりです。

  1. まず、顧客は自分のIDを入力します。見つからない場合はメインメニューに戻り、それ以外の場合は続行します(お客様は別のファイルに保存されているデータベース内にIDを登録する必要があります)

  2. それは彼らが購入しようとしている製品を尋ねます(それは製品名を尋ねます[それは講師が名前でそれを望んでいた方法です]そしてそれが見つからない場合はそれが存在し、そうでなければそれは進みます

  3. 購入する数を尋ね、在庫が十分にあるかどうかを確認します。続行する場合は続行し、それ以外の場合はユーザーに別の番号を入力するか終了するかを尋ねます

  4. 価格は自動的に計算され、確認が求められます。顧客が確認した場合は保存が行われ、そうでない場合はメインメニューに戻ります

今私の問題は、STRUCTが保存されていても、データベースに任意の注文を出力するようになると(今のところ、最初に顧客の最後の注文が必要なのでテストしています)、データベースが常に空として表示されることです。以下はコーディング[申し訳ありませんが、どこが間違っているのかわかりません]のコーディングであり、すべてリスト機能も提供します。

プログラムがどのように機能するかをよりよく理解するために、スクリーンショットも提供されています。

void customerOrder()
{
    int checkID = 0; //variable to hold the ID input
    char ch;
    char ch1;
    char ch2;
    char option;
    char tempName [100];
    int  order = 0;
    int  tempStock = 0;
    float tempPrice = 0;



    printf ("\n\n\n\n\t\t    ************* Add Customer Order *************\n \n \n");

    // ----------- LOADING OF THE 3 DATA FILES -----------//
    if ((ofp = fopen ("orders.dat","a+b")) == NULL)
    {
        fputs   ("Error! Cannot open orders.dat\n",stderr);
        system  ("PAUSE");
        orderMainMenu();
    }
    rewind (ofp);

    if ((cfp = fopen ("customers.dat","r"))== NULL)
    {
        fputs ("Error! Cannot open customers.dat\n",stderr);
        system ("PAUSE");
        orderMainMenu();
    }
    rewind (cfp);

    if ((pfp = fopen ("products.dat","r+b"))== NULL)
    {
        fputs ("Error! Cannot open products.dat\n",stderr);
        system ("PAUSE");
        orderMainMenu();
    }
    rewind (pfp);

    //-------- Confirm whether to start Order ------------//
    printf ("WARNING: In order for an Order to be made, the Customer must be in the Database\n");
    printf ("Are you sure you want to continue? Y or N\n");
    while (getchar() !='\n')
    {
    }
    ch1 = getchar ();
    if (ch1 == 'Y' || ch1 == 'y')
    {
        // ---- INPUT OF CUSTOMER ID --------------//
        printf ("\nPlease Enter ID: ");

            while (scanf ("%d",&checkID) == 0)
            {
                printf ("\n\nInvalid Input!!!\n");
                printf ("Either you have entered a Letter!!\n");
                printf ("Press 'Y' to enter another ID or any key to return to MainMenu\n\n");
                while (getchar()!='\n')
                    {
                    }
                option = getchar();
                if (option == 'Y' || option == 'y')
                {
                    printf ("\nPlease Enter Another ID Number:\n");
                }
                else
                {
                    printf ("\nReturning to Order Management Menu\n");
                    system ("PAUSE");
                    fflush(stdin);
                    orderMainMenu();

                }
            }
            //---------- CHECK WHETHER ID EXISTS OTHERWISE EXIT TO MENU --------------//
            while (fread (&c, STRUCTSIZEC,1,cfp) == 1)
            {
                if (c.ID == checkID)
                {

                    clrscr();
                    printf ("\n\n\n\n\t\t    ************* Add Customer Order *************\n \n \n");

                    // SHOWS WHICH ID IS BEING SERVED //
                    printf ("\n\nNew Order For ID: %d\n", c.ID);


                    // ASKS WHICH PRODUCT TO BUY //
                    printf ("\nWhich Product do you want to buy?\n\n");
                    printf ("WARNING! Product Name is CASE SENSITIVE:\n");

                    // INPUT NAME //
                    printf ("Product Name: ");
                    while (getchar() !='\n')
                    {
                    }

                    fgets  (tempName, 100, stdin);
                    while (fread (&p, STRUCTSIZEP,1,pfp)== 1)
                    {
                        if (strncmp (tempName,p.pName,sizeof(tempName)) == 0)
                        {


                    // --- SHOWING ID and WHICH PRODUCT CUSTOMER IS GOING TO BUY -- //
                    clrscr ();
                    printf ("\n\n\n\n\t\t    ************* Add Customer Order *************\n \n \n");
                    printf ("Order for ID: %d\n", c.ID);
                    printf ("Product Name: %s\n\n", p.pName);

                    tempStock = p.pStock;

                    printf ("How many do you wish to buy?\n");
                    printf ("Currently there is %d in Stock", tempStock);
                    printf ("Order:  ");

                    while (scanf ("%d",&order) == 0)
                    {
                        printf ("Invalid Order! Only Numbers are  allowed!\n");
                        while (getchar() !='\n')
                        {
                        }
                    }
                    //---- CHECK WEHTHER ORDER IS BIGGER THAN WHAT IS FOUND IN STOCK ----//
                    //---- IF YES ASK IF USER WANTS TO INPUT ANOTHER NUMBER OR EXIT ----//
                    while (order > tempStock)
                    {
                        printf ("There is not enough items in Stock to satisfy that quantity!\n");
                        printf ("Do you want to enter another quantity? 'Y' for yes, any key to return to Menu\n");
                        fflush (stdin);
                        ch2 = getchar();
                        if (ch2 == 'Y' || ch2 == 'y')
                        {
                            printf ("Please enter another quantity:\n");
                            scanf ("%d",&order);
                        }
                        else
                        {
                            printf ("Order Canceled! Returning to Main Menu");
                            system ("PAUSE");
                            fclose (cfp);
                            fclose (ofp);
                            fclose (pfp);
                            orderMainMenu();
                        }
                    }

                    printf ("\nTotal Price for this Order will be:\n");
                    tempPrice = (order * p.pPrice);
                    printf ("Total: %.2f\n", tempPrice);

                    // ---- SHOW THE TRANSACTION OF THE USER AND ASK WHETHER TO CONFIRM ---- //
                    clrscr();
                    printf ("\n\n\n\n\t\t    ************* Add Customer Order *************\n \n \n");

                    printf ("This is the Customer's Overview of Purchase:\n\n");
                    printf ("Customer's ID: %d\n",c.ID);
                    printf ("Customer's Product: %s",p.pName);
                    printf ("Order: %d\n",order);
                    printf ("Total Price: %.2f\n\n",tempPrice);

                    printf ("\n\n----------------------------------------\n\n");
                    printf ("Are you sure you of this transaction?\n");
                    printf ("Warning: After Confirming you cannot change the Order!\n");
                    printf ("Press 'Y' to confirm the Transaction otherwise press 'N' to cancel the order and return to Main Menu\n");

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

                    ch = getchar();
                    if (ch == 'N' || ch == 'n')
                     {
                         printf ("Transaction CANCELLED! Returning to Order Main Menu!\n");
                         system ("PAUSE");
                         orderMainMenu();
                     }
                     else if (ch == 'y' || ch == 'Y')
                     {
                         tempStock = (tempStock - order);
                         p.pStock = tempStock; //Updates the new stock number in Products' Database
                         fseek (pfp,-STRUCTSIZEP,SEEK_CUR);
                         fwrite(&p, STRUCTSIZEP,1,pfp);
                         fclose (pfp);

                         o.quantity = order;
                         o.cID = c.ID;
                         o.price = tempPrice;
                         strncpy(o.pName,p.pName, sizeof(p.pName));
                         o.timer = time(NULL);

                         fwrite (&o,STRUCTSIZEO,1,ofp);
                         fclose (ofp); //Closing of Files
                         fclose (cfp);
                         fclose (pfp);

                         printf("The Transaction Order saved is as follows:\n");
                         printf("ID: %d\nProduct: %sQuantity: %d\nPrice: %.2f\n",o.cID,o.pName,o.quantity,o.price);
                         printf("Transaction Made at: %s\n",asctime(localtime(&o.timer)));
                         system ("PAUSE");
                         orderMainMenu();
                     }
                }
            }
        }
    }
    }
    else
    {
        printf ("Returning to Order Main Menu\n");
        system ("PAUSE");
        orderMainMenu();
    }
}

ListAllメソッド:

void oListAll()
{
    order o;

    printf ("\n\n\n\n\t\t    ********** Current Products in the Database *******\n \n \n");

    //--------------- LOADING OF FILE ------------ //
    if ((ofp = fopen ("orders.dat","rb")) == NULL)
    {
        fputs ("Cannot open products.dat file!\n",stderr);
        printf ("Returning to Order Main Menu\n");
        system ("PAUSE");
        orderMainMenu();
    }
    rewind (ofp);

    // --------- START TO TRAVERSE THE DATABASE AND OUTPUT DATA -------- //
    printf ("Current Orders in the Database:\n");
    while (fread (&o, STRUCTSIZEO,1,pfp)==1)
    {
        printf (" Name: %s Price: %.2f\n In Stock: %d\n\n", o.pName, o.price, o.quantity);
    }
    system ("PAUSE");
    productMainMenu();

}

これらはスクリーンショットです:

  1. http://tinypic.com/r/110x7c2/6
  2. http://tinypic.com/r/1446ya/6
  3. http://tinypic.com/r/315iy3s/6
  4. http://tinypic.com/r/15xo4lt/6
  5. http://tinypic.com/r/2ze9wfr/6
  6. http://tinypic.com/r/jtx8xw/6

かなり長いことは承知していますが、ご容赦ください。4時間以上、何が問題なのかを突き止めようとしています。本当にありがとう

4

2 に答える 2

1

あなたのoListAll()関数は開きますがFILE *ofp、から読み取りますpfp。から読んでみるofp

于 2012-12-27T14:02:01.520 に答える
1

これはプログラム全体ではないため、問題を見つけることはできませんが、ファイルポインターがグローバル変数であることに関係していると思います。それらをローカルにし、常に適切に閉じていることを確認する必要があります。

customerOrder() 関数を小さな関数に分割します。これにより、コードの読み取り、デバッグ、および変更がはるかに簡単になります。例(これは単なる擬似コードです。空白を埋める必要があります):

void customerOrder()
{
    int checkId = getCustomerID(); // Checks the DB to see if user exists
    bool productExists = checkProduct(tempName); // Checks the DB to see if product exists
    int productCount = getProductCount(tempName);  // Checks the DB to get count of items in stock
    saveOrder(checkId, tempName, order);  // Save the order
}

// Save the order in DB. Ensures FILE pointers are closed when done
void saveOrder(int customerID, const char * productName, int count)
{
    order o;
    // Create the order here....
    FILE *ofp = fopen ("orders.dat","ab");
    if (NULL != ofp) {
        fwrite (&o,STRUCTSIZEO,1,ofp);
        fclose (ofp); //Closing of Files
    }
}
于 2012-12-27T14:43:01.357 に答える