修改特定条目时,所有文件内容都会重复

时间:2016-06-29 10:19:55

标签: c file structure

此代码读/写二进制文件的数据。这里modify()将从用户那里获取输入,在文件中搜索它。如果找到,将提示用户提供新条目,旧条目将被替换。

问题是,modify() fwrite()之后break如果我while break循环,那么一切都会好的,但是,如果我不这样做的话仍然会被修改,但同时文件的内容会重复,为什么会这样?

与开始时一样,文件中没有重复的条目。 所以我期望的是,即使我不使用if(strcmp(e.name,user)==0),循环仍应继续,并在读取完整个文件后终止。这里,if只对一个条目成立,因此控件应该只在此 #include<stdio.h> #include<stdlib.h> #include<string.h> void add(FILE *); void list(FILE *); void modify(FILE *); struct emp { char name[20]; int id; float sal; }e; void add(FILE *f) { char *p=NULL; printf("\nEnter name id sal\n"); scanf(" %s %d %f", e.name,&e.id,&e.sal); fseek(f,0,SEEK_END); if((fwrite(&e,sizeof(struct emp),1,f))==1) { printf("\nAdded Successfully\n"); } else { printf("\nError wrting to file in ADD func\n"); } } void list(FILE *f) { rewind(f); while(fread(&e,sizeof(struct emp),1,f)>0) { printf("\nRead %s %d %f\n",e.name,e.id,e.sal); } } void modify(FILE *f) { char user[20]; char *p=NULL; printf("\nEnter name to modify\n"); scanf(" %s", user); rewind(f); while(fread(&e,sizeof(struct emp),1,f)==1) { //printf("\n --------------- %s %d %f\n",e.name,e.id,e.sal); if(strcmp(e.name,user)==0) { //fseek(f,-sizeof(struct emp),SEEK_CUR); printf("\nEnter new name id salary\n"); scanf(" %s %d %f", e.name,&e.id,&e.sal); fseek(f,-sizeof(struct emp),SEEK_CUR); if(fwrite(&e,sizeof(struct emp),1,f)==1) { printf("\nModified successfull!!\n"); //break; } else { printf("\nError while modifying\n"); } } else { printf("\n\nstring not matched\n\n"); } } } int main() { char val='T'; FILE *fp=NULL; if((fp=fopen("database.dat","rb+"))==NULL) { if((fp=fopen("database.dat","wb+"))==NULL) { printf("\nError opening file in wb+ mode\n"); exit(0); } } do { printf("\nEnter a to add, l to list, d to delete, m to modify and e to exit\n"); scanf(" %c", &val); switch(val) { case 'a': add(fp); break; case 'l': list(fp); break; case 'm': modify(fp); break; case 'd': // del(fp); break; case 'e': fclose(fp); exit(0); break; default: printf("\nInvalid Input\n"); break; } } while(1); } 块中输入一次。然后条目如何重复?

 Intent syncIntent = new Intent(this, ScanBLE_Service.class);
 this.startService(syncIntent);

1 个答案:

答案 0 :(得分:2)

我认为这是fread()fwrite()之间的问题。 使用fwrite()修改emp后,继续while循环而不使用fseek()。 事实上,在之前,你使用fseek()返回并且没关系。 现在你必须放置另一个不移动的fseek(),如下所示:

fseek(f, 0, SEEK_CUR);

现在你可以删除中断,你的Modify()函数就像这样:

void modify(FILE *f)
{
    char user[20];
    printf("\nEnter name to modify\n");
    scanf("%s",user);
    fflush(stdin);
    rewind(f);

    while(fread(&e,sizeof(struct emp),1,f)==1)
    {
        if(strcmp(e.name,user)==0)
        {
            printf("\nEnter new name id salary\n");
            scanf("%s %d %f",e.name,&e.id,&e.sal);
            fflush(stdin);

            fseek(f,-sizeof(struct emp),SEEK_CUR);
            if(fwrite(&e,sizeof(struct emp),1,f)==1)
            {
                printf("\nModified successfull!!\n");
                //break; //This can be removed

                fseek(f, 0, SEEK_CUR); //Place this here
            }
            else
            {
                printf("\nError while modifying\n");
            }
        }
        else
        {
            printf("\n\nstring not matched\n\n");
        }
    }
}