0

ユーザーが注文を作成する AddOrder() というメソッドがあります。システムがユーザーに製品名の入力を求めると、システムは products.dat ファイルから特定のレコードを取得します。次に、ユーザーは製品数量と注文の確認を求められます。注文記録が確認されると、products.dat ファイルの在庫数量を更新して、その特定の製品の製品数量を差し引いてシステムに更新してもらいます。残念ながら在庫数は変わらずです。これは私のコードです。

void addOrder()
{
    FILE *pfp;
    order o1;
    product p;
    char ProductName[100];
    int found = 0;
    int choice = 0;
    int tmpStock = 0;
    double pPrice = 0.0;
    int choice2 = 0;

    ofp=fopen("orders.dat","ab");
    pfp=fopen("products.dat", "rb");



    printf("\n========================================================\n\n");
    printf("\t\t Adding an Order\n\n");
    printf("========================================================\n\n");

    do
    {
        printf("Enter CustomerID: \n");
        scanf("%s",&o1.CustomerID);
    }while(!findCustomer(o1.CustomerID));


    printf("Enter Product Name: \n");
    scanf("%s", ProductName);

    while(1)
    {
    fread(&p,sizeof(p),1,pfp);

    if(feof(pfp))
    {
    break;
    }
    if(strcmp(ProductName,p.ProductName)==0)
    {
        found = 1;
        tmpStock = p.QuantityInStock;
        pPrice = p.price;

    }
    }
    if(found == 0)
    {
        printf("The Product was not found!\n");
        OrdersSubMenu();
    }

    printf("Enter Product Quantities: \n");
    scanf("%d", &o1.ProductQuantities);

    if(o1.ProductQuantities > tmpStock)
    {
        printf("You have axeceeded available stock! Available Stock: %d\n", tmpStock);
        printf("Do you want to enter product quantity again(press 1)\n");
        printf("or order a different product(press 2)?\n");
        scanf("%d", &choice);

        if(choice == 1)
        {
             printf("Enter Product Quantities: \n");
             scanf("%d", &o1.ProductQuantities);
        }
        else
        if(choice == 2)
        {
            OrdersSubMenu();
        }
    }
    else
    {

        printf("Product Quantity is available\n");
    }

    o1.TotalOrderPrice = o1.ProductQuantities * pPrice;
    printf("Total Order Price: %.2f\n", o1.TotalOrderPrice);

    printf("Do you want to confirm order? If yes press 1, if no press 2: \n");
    scanf("%d", &choice2);

    if(choice2 == 1)
    {
        fwrite(&o1,sizeof(o1),1,ofp);


    }
    else
        if(choice2 == 2)
    {
        OrdersSubMenu();
    }


    printf("Order record was added to the system!\n");

    tmpStock = tmpStock-o1.ProductQuantities;
    p.QuantityInStock =tmpStock;


    fclose(ofp);
    fclose(pfp);
}
4

1 に答える 1

0

products.dat ファイルの在庫数をシステムに更新させたい

しかし、read access のために products.dat しか開いていませんpfp=fopen("products.dat", "rb");

あなたのfwriteステートメントは toofpで、別のファイルに開かれています:ofp=fopen("orders.dat","ab");

変数ofpが宣言されていないため、コードの少なくとも 1 行が欠落しています。そうしないと、コンパイルできません。更新: 何らかの理由ofpでグローバル化されましたが、なぜですか? それにもかかわらず、機能には影響しません (単一のスレッドを想定)。

編集: ファイルに書き込んで書き込むには、モード "r+b" で開きます。在庫を更新したい製品を見つけて、現在のファイル位置を後方に移動する必要があります。

fseek(pfp, -sizeof(product), SEEK_CUR);

次にfwrite、新しい製品レコード。sizeof の - 記号に注意してください。現在のファイル位置を、読み取ったばかりのレコードの先頭に移動しています。

于 2013-01-06T15:15:19.727 に答える