0

基本上,我正在尝试开发一个客户订单系统。我编写了一个方法,系统可以获取特定客户的最新订单。要求用户输入客户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

4 回答 4

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
        }
[...]

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

于 2013-01-09T11:51:31.993 回答
1

您的代码是正确的,您只是未能在第一次成功找到时跳出 while 循环。然后它还会继续查找并打印所有以前的订单。

if(strcmp(Customerid,o.CustomerID)== 0)
{
  ... // printing
  break; 
}
于 2013-01-09T11:55:06.793 回答
1

第 1 点:

scanf("%s",&Customerid);

在上面的声明中,%sis expectingchar *但是你传递了char *手段的地址char **,所以你的声明应该是..

scanf("%s", Customerid);

第 2 点:

使用feofbefore fread, after freadfeof将返回1你的情况,所以声明应该是..

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

第 3 点:

正如@acraig5075 提到的那样使用Break;内部块..if

于 2013-01-09T12:22:32.107 回答
0
scanf("%s",&Customerid);

如果CustomerIdint %s期望char *

于 2013-01-09T11:31:41.380 回答