从文件中获取特定客户的最新订单

时间:2013-01-09 11:26:32

标签: c

基本上,我正在尝试开发客户订单系统。我写了一个方法,系统获取特定客户的最新订单。要求用户输入客户ID号以获得相应的订单。此功能无法正常工作,因为它是第一个订单而不是最后一个订单。我在我的方法中使用了fseek,但它仍然无效。

void ViewLatestOrder()
{
    order o;
    char Customerid[10];


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

    printf("\nEnter the Customer ID: \n");
    scanf("%s",&Customerid);

    rewind(ofp);
    fseek(ofp, -sizeof(order), SEEK_END);

    while(fread(&o,sizeof(o),1,ofp)==1 && !feof(ofp))
    {
        if(strcmp(Customerid,o.CustomerID)== 0)
        {

            printf("\n========================================================\n\n");
            printf("\t\t Order Details of %s\n\n",o.CustomerID);
            printf("========================================================\n\n");

            printf("Product Name: %s\n",o.ProductName);
            printf("Product Quantities: %d\n",o.ProductQuantities);
            printf("Total Order Price: %.2f\n",o.TotalOrderPrice);


            printf("========================================================\n\n");
        }
        else
        {
            fseek(ofp, -2*sizeof(order), SEEK_CUR);
        }
    }


    OrdersSubMenu();
    fclose(ofp);

    }

4 个答案:

答案 0 :(得分:1)

首先,在相同的 FILE * 上使用 feof() fseek()似乎不对,正如文档中所述:

  

[...]成功调用fseek()函数会清除          流的文件结束指示符并撤消该流的任何影响          ungetc(3)在同一个流上运行。 [...]

要做到这一点,你应该检查你是否只是通过以下方式来搜索文件中的第一个条目:

[...]
else
        {
            if(fseek(ofp, -2*sizeof(order), SEEK_CUR) == sizeof(order))
                break; // End the while if we rode ALL the records
        }
[...]

无论如何,我真的没有发现为什么在这个世界上,正如你所说的那样,打印第一个而不是最后一个条目......

答案 1 :(得分:1)

你的代码是对的,你只是在第一次成功查找时没有突破while循环。然后它继续查找并打印所有先前的订单。

if(strcmp(Customerid,o.CustomerID)== 0)
{
  ... // printing
  break; 
}

答案 2 :(得分:1)

第1点:

scanf("%s",&Customerid);

在上述声明中,%s期待char *,但您传递的地址char *表示char **,因此您的声明应该是..

scanf("%s", Customerid);

第2点:

feof之前使用freadfread之后,feof将根据您的情况返回1,所以声明应该是..

while(!feof(ofp) && fread(&o,sizeof(o),1,ofp)==1)

第3点:

Break;块内使用if作为@ acraig5075提到..

答案 3 :(得分:0)

scanf("%s",&Customerid);

如果CustomerId int %s期望char *