基本上,我正在尝试开发客户订单系统。我写了一个方法,系统获取特定客户的最新订单。要求用户输入客户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);
}
答案 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
之前使用fread
,fread
之后,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 *