c…fwrite中的二进制文件更新未成功写入整个结构

c…fwrite中的二进制文件更新未成功写入整个结构,c,struct,binaryfiles,fwrite,fileupdate,C,Struct,Binaryfiles,Fwrite,Fileupdate,我有一个文件是为写/读(fopen(名称,“wb+”)而打开的,其中包含下面的结构加载 struct pedia { int code; char descr[50]; int TM; int pos; int flag; }; 整个文件使用从0到文件大小(用户给出大小)的代码初始化,标志为0,descr=“”和TM=pos=-1 当我要求用户写入他想要更新的注册的#时,我打印了保存在那里的结构,它被正确打印 此外,当我调用输入函数时,用户为结构中的每个

我有一个文件是为写/读(fopen(名称,“wb+”)而打开的,其中包含下面的结构加载

struct pedia
{
    int code;
    char descr[50];
    int TM;
    int pos;
    int flag;
};
整个文件使用从0到文件大小(用户给出大小)的代码初始化,标志为0,descr=“”和TM=pos=-1

当我要求用户写入他想要更新的注册的#时,我打印了保存在那里的结构,它被正确打印

此外,当我调用输入函数时,用户为结构中的每个变量设置新值,我会立即打印代码、descr等,并成功更改它们

但是,当我使用fwrite将结构写入文件时,它只在文件中成功写入1项

void fileupdate(FILE *f,int filesize)
{
     struct pedia *field;
     field=(struct pedia *)malloc(sizeof(struct pedia));
     int k,key;
     char opt[5];
     int num=0;

     while(1)
     {
         puts("\nUPDATE\n");

         printf("\nType the # of the registration you want to update (key must be between 0 and %d) \n\nkey:",filesize);

         scanf("%d",&key);
         getchar();

         if(key>=0 && key<=filesize)
         {
             fseek(f,sizeof(struct pedia)*key,SEEK_SET);
             fread(field,sizeof(struct pedia),1,f);

             printf("%d,%s,%d,%d,%d\n",field->code,field->descr,field->TM,field->pos,field->flag);

             if(field->flag==0)
             {
                  puts("type yes to register new info or no to cancel the update\n");
                  fgets(opt,sizeof(char)*5,stdin);

                  if(isspace(*(opt+strlen(opt)-1)))
                *(opt+strlen(opt)-1)='\0';

                  if(strcmp(opt,"yes"))
                continue;

                  printmask();
                  input(&field);

                  num=fwrite(field,sizeof(struct pedia),1,f);
                  printf("\n%d,%s,%d,%d,%d\n",field->code,field->descr,field->TM,field->pos,field->flag);

                  printf("num=%d\n",num);
        }
    }
}
void fileupdate(文件*f,int filesize)
{
结构pedia*字段;
字段=(struct pedia*)malloc(sizeof(struct pedia));
int k,键;
charopt[5];
int num=0;
而(1)
{
放置(“\n更新\n”);
printf(“\n键入要更新的注册的#(密钥必须介于0和%d之间)\n\n密钥:”,文件大小);
scanf(“%d”和键)(&key);
getchar();
如果(键>=0&&keycode,字段->描述,字段->商标,字段->位置,字段->标志);
如果(字段->标志==0)
{
puts(“键入“是”以注册新信息,或键入“否”以取消更新\n”);
fgets(可选,尺寸(字符)*5,标准尺寸);
if(isspace(*(opt+strlen(opt)-1)))
*(opt+strlen(opt)-1)='\0';
如果(strcmp(选择“是”))
继续;
打印掩码();
输入(&字段);
num=fwrite(字段,sizeof(struct pedia),1,f);
printf(“\n%d,%s,%d,%d,%d\n”,字段->编码,字段->描述,字段->商标,字段->位置,字段->标志);
printf(“num=%d\n”,num);
}
}
}

fread()
fwrite()
之间没有
fseek()
,因此
fwrite()
不会覆盖要更新的结构,而是覆盖下一个结构

这是正确的。在代码中,
fwrite
写入一个大小为
sizeof(struct pedia)
的元素。返回值是写入的元素数,而不是字节数。我看这里没什么问题。输出文件是否符合预期?以哪种模式打开文件?它处于附加模式?你能从调用
fileupdate
函数中显示更多代码吗?不……如果我要求更新的下一个代码是我以前编辑过的代码,我打印它,它就像什么都没有改变…仍然打印初始化的信息。在写入文件的当前位置之前,有必要重新设置文件位置,因为在您刷新后,文件的当前位置已落后于一条记录。