C 从文件中获取特定客户下的最新订单
基本上,我正在尝试开发一个客户订单系统。我编写了一个方法,其中系统获取特定客户下的最新订单。要求用户输入客户id号以获得相应的订单。此函数无法正常工作,因为它获取的是第一个订单,而不是最后一个订单。我在我的方法中使用了fseek,但它仍然不起作用C 从文件中获取特定客户下的最新订单,c,C,基本上,我正在尝试开发一个客户订单系统。我编写了一个方法,其中系统获取特定客户下的最新订单。要求用户输入客户id号以获得相应的订单。此函数无法正常工作,因为它获取的是第一个订单,而不是最后一个订单。我在我的方法中使用了fseek,但它仍然不起作用 void ViewLatestOrder() { order o; char Customerid[10]; ofp=fopen("orders.dat","rb"); printf("\nEnter the Cu
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);
}
如果CustomerId
是int
%s
需要char*
如果
CustomerId
为int
%s
需要char*
首先,在同一文件*上使用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
}
[...]
无论如何,我真的无法发现为什么像你说的那样,这个打印第一个条目而不是最后一个条目…首先,在同一个文件上使用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
}
[...]
无论如何,我真的没能发现为什么像你说的那样,这个打印第一个条目而不是最后一个条目…你的代码是对的,你只是没能在第一次成功查找时跳出while循环。然后,它会继续查找并打印所有以前的订单
if(strcmp(Customerid,o.CustomerID)== 0)
{
... // printing
break;
}
您的代码是正确的,只是在第一次成功查找时未能突破while循环。然后,它会继续查找并打印所有以前的订单
if(strcmp(Customerid,o.CustomerID)== 0)
{
... // printing
break;
}
第1点:
scanf("%s",&Customerid);
在上面的语句中,%s
期望的是char*
,但您要传递给它的char*
的地址意味着char**
,因此您的语句应该是
scanf("%s", Customerid);
while(!feof(ofp) && fread(&o,sizeof(o),1,ofp)==1)
第2点:
scanf("%s",&Customerid);
在fread
之前使用feof
,在fread
之后使用feof
将根据您的情况返回1
,因此语句应该是
scanf("%s", Customerid);
while(!feof(ofp) && fread(&o,sizeof(o),1,ofp)==1)
第3点:
scanf("%s",&Customerid);
使用
Break代码>内部if
块如@acraig5075所述。第1点:
scanf("%s",&Customerid);
在上面的语句中,%s
期望的是char*
,但您要传递给它的char*
的地址意味着char**
,因此您的语句应该是
scanf("%s", Customerid);
while(!feof(ofp) && fread(&o,sizeof(o),1,ofp)==1)
第2点:
scanf("%s",&Customerid);
在fread
之前使用feof
,在fread
之后使用feof
将根据您的情况返回1
,因此语句应该是
scanf("%s", Customerid);
while(!feof(ofp) && fread(&o,sizeof(o),1,ofp)==1)
第3点:
scanf("%s",&Customerid);
使用Break
insideif
block如@acraig5075所述。OT:由于您有意在eof之前寻找一个订单,您是否希望feof()在您的while表达式中是变量?尝试使用printf打印当前位置(“位置:%d\n”,ftell(ofp))代码>。这应该有助于你解决这个问题。放一个断点代码>找到结果后。OT:由于您有意在eof之前查找一个订单,您是否希望feof()在while表达式中是变量?请尝试使用printf打印当前位置(“位置:%d\n”,ftell(ofp))代码>。这应该有助于你解决这个问题。放一个断点代码>在你找到结果后。我认为代码是不对的,正如我在回答中所说的,但你告诉他必须做的是完全正确的。你介意我把它添加到我的答案中吗?我在问acraig,谁是这个答案的作者,对不起。不管怎样,检查他的答案,它应该会解决你的问题。我认为代码不正确,正如我在回答中所说的,但你告诉他必须做的是完全正确的。你介意我把它添加到我的答案中吗?我在问acraig,谁是这个答案的作者,对不起。不管怎样,检查他的答案,它会解决你的问题。