c .... fwrite中的二进制文件更新不会成功写入整个结构

时间:2014-04-16 09:01:59

标签: 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

当我要求用户写下他想要更新的注册号时,我打印保存在那里的结构,然后正确打印。

当我调用输入函数,其中用户为结构中的每个变量设置新值时,我会立即打印代码,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);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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