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

C 从文件中获取特定客户下的最新订单,c,C,基本上,我正在尝试开发一个客户订单系统。我编写了一个方法,其中系统获取特定客户下的最新订单。要求用户输入客户id号以获得相应的订单。此函数无法正常工作,因为它获取的是第一个订单,而不是最后一个订单。我在我的方法中使用了fseek,但它仍然不起作用 void ViewLatestOrder() { order o; char Customerid[10]; ofp=fopen("orders.dat","rb"); printf("\nEnter the Cu

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

    }
如果
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
inside
if
block如@acraig5075所述。

OT:由于您有意在eof之前寻找一个订单,您是否希望feof()在您的while表达式中是变量?尝试使用
printf打印当前位置(“位置:%d\n”,ftell(ofp))。这应该有助于你解决这个问题。放一个
断点找到结果后。OT:由于您有意在eof之前查找一个订单,您是否希望feof()在while表达式中是变量?请尝试使用
printf打印当前位置(“位置:%d\n”,ftell(ofp))。这应该有助于你解决这个问题。放一个
断点在你找到结果后。我认为代码是不对的,正如我在回答中所说的,但你告诉他必须做的是完全正确的。你介意我把它添加到我的答案中吗?我在问acraig,谁是这个答案的作者,对不起。不管怎样,检查他的答案,它应该会解决你的问题。我认为代码不正确,正如我在回答中所说的,但你告诉他必须做的是完全正确的。你介意我把它添加到我的答案中吗?我在问acraig,谁是这个答案的作者,对不起。不管怎样,检查他的答案,它会解决你的问题。