C-fseek()在尝试更新记录时影响文件的内容(结构)

C-fseek()在尝试更新记录时影响文件的内容(结构),c,struct,structure,file-handling,fseek,C,Struct,Structure,File Handling,Fseek,不确定此函数中的fseek()有何错误,因为我认为这是导致程序输出错误的原因 index = 0; present = 0; while(fread(&beverage, sizeof(struct beverages), 1, filepointer)) { if(newFile == 0) break; printf("%s\n\n", beverage.bcode); getch

不确定此函数中的fseek()有何错误,因为我认为这是导致程序输出错误的原因

   index = 0;
    present = 0;
    while(fread(&beverage, sizeof(struct beverages), 1, filepointer))
    {
        if(newFile == 0)
            break;

        printf("%s\n\n", beverage.bcode);
        getch();

        if(strcmp(_bev_name, beverage.bname) == 0)
        {
            printf("Inside if statement\n\n");
            getch();

            beverage.quantity = beverage.quantity + qty;
            beverage.qty_last_purchase = qty;


            priceOne = spent/qty;//Used to calculate the cost price for one beverage
            beverage.price = priceOne + (priceOne*0.10);//Calculation of sale price for beverage

            printf("%d\n\n", index);
            getch();

            fseek(filepointer,index*sizeof(struct beverages),SEEK_SET);
            fwrite(&beverage,sizeof(struct beverages),1,filepointer);

            present = 1;
            break;
        }
        else
        {
            present = 0;
            index = index + 1;
        }

    }

    if(present == 0)
    {
        //Stores new beverage name
        strcpy(beverage.bname, _bev_name);

        //Creation of beverage code using the first two letters of beverage name and random 3 digit number
        srand(time(NULL));
        int ran_num = rand()%(999 + 1 - 100) + 100;
        char str[3];

        itoa(ran_num, str,10);

        beverage.bcode[0] = beverage.bname[0];
        beverage.bcode[1] = beverage.bname[1];
        beverage.bcode[2] = str[0];
        beverage.bcode[3] = str[1];
        beverage.bcode[4] = str[2];
        beverage.bcode[5] = '\0';

        beverage.qty_last_purchase = qty;
        beverage.quantity = qty;
        priceOne = spent/qty;//Used to calculate the cost price for one beverage
        beverage.price = priceOne + (priceOne*0.10);//Calculation of sale price for beverage

        fwrite(&beverage, sizeof(struct beverages), 1, filepointer);

    }
代码的第一部分在现有文件中循环,以找到匹配的饮料代码,然后更新饮料的数量和价格,但实际情况是,它正在影响文件中的其他结构

需要注意的是,我选择更新第一张图片中的第一个饮料,但正如您所看到的,它会影响第二个饮料记录

编辑:结构的定义

struct beverages
{
    char bname[NAME_LIMIT];
    char bcode[MAX_SIZE];
    int quantity;
    int qty_last_purchase;
    float price;
} beverage;

虽然您没有显示代码中最重要的部分:
struct beverages
的定义,但我坚信您找错了方向,您的问题与
fseek()
毫无关系

看来,
struct beverages
beverage.bname
中没有存储饮料的名称文字字符,而是一个指向它们的指针


因此,您最有可能保存和检索指针而不是值。一旦恢复,这些指针指向无意义的数据。要么将所有数据存储在数据记录中,要么熟悉序列化和反序列化的概念。

我看不出代码有什么问题,但我看到的是您正在结合顺序文件访问(依赖于文件在读/写后更新其内部文件位置)对于随机文件访问(调用
fseek()
),这可能会导致大麻烦。在读取/写入记录之前,请尝试每次调用
fseek()
,以查找特定的记录索引。@MikeNakis,如果可能的话,请给我举个例子……我是C语言的一些新手,所以我不太确定如何继续您所说的内容。编辑显示struct beverageso.k的定义,看起来不错。接下来要研究的是您的
itoa()
用法。这看起来很奇怪。我应该改用sprintf吗?要么这样,要么修复现有的问题。您期望一个三位数的数字,当转换为字符串时,它至少会使用四个字节,但只为它保留三个字节。这并不会真正改变任何事情