C 根据订购数量的金额修改库存数量

C 根据订购数量的金额修改库存数量,c,C,我有一个名为AddOrder()的方法,用户在其中创建订单。当系统要求用户输入产品名称时,系统将从products.dat文件中获取特定记录。然后询问用户产品数量,并确认订单。确认订单记录后,我希望系统更新products.dat文件y中的库存数量,从中减去该特定产品的产品数量。不幸的是,库存数量保持不变。这是我的密码 void addOrder() { FILE *pfp; order o1; product p; char ProductName[100];

我有一个名为AddOrder()的方法,用户在其中创建订单。当系统要求用户输入产品名称时,系统将从products.dat文件中获取特定记录。然后询问用户产品数量,并确认订单。确认订单记录后,我希望系统更新products.dat文件y中的库存数量,从中减去该特定产品的产品数量。不幸的是,库存数量保持不变。这是我的密码

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);
}
我希望系统更新products.dat文件中的库存数量

但您只打开products.dat进行读取访问
pfp=fopen(“products.dat”、“rb”)

您的
fwrite
语句是到
ofp
,它被打开到另一个文件:
ofp=fopen(“orders.dat”,“ab”)

未声明变量
ofp
,因此至少缺少一行代码,否则它将无法编译。更新:由于某种原因,ofp已经全球化,但为什么?不过,这不应影响功能(假设为单个线程)

编辑:要写入和写入文件,请以“r+b”模式打开它。您需要找到要更新其库存的产品,然后将当前文件位置向后移动


然后写入新产品记录。注意sizeof上的-sign:我们正在将当前文件位置移动到刚刚读取的记录的开头。

要求人们发现代码中的错误是无效的。您应该使用调试器(或添加print语句)来隔离问题,然后构造一个。我已经使用printf在应用减法后检查tmpStock的值。当程序到达该语句时,它停止工作,表示:products.exe已停止工作。我不知道是什么问题。在调试器下运行程序。当程序停止工作时,调试器将告诉您为什么.ofp被声明为静态文件*ofp;在addOrder方法之前的开始处。我想这就是库存量没有变化的原因。但是我应该如何用同样的方法同时读写一个文件呢?我将模式改为r+b并添加了fseek和fwrite,但现在系统找不到该产品。请使用类似od(1)的东西检查文件格式。
fseek(pfp, -sizeof(product), SEEK_CUR);