C-fseek()在尝试更新记录时影响文件的内容(结构)
不确定此函数中的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
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吗?要么这样,要么修复现有的问题。您期望一个三位数的数字,当转换为字符串时,它至少会使用四个字节,但只为它保留三个字节。这并不会真正改变任何事情