在C中编辑文件中的一行

时间:2015-01-11 08:51:57

标签: c

我正在创建此更改功能。 void cha(struct cont x);,它会询问lname,然后检查它是否在文件中。之后,它将编辑。再次请求lname和fname。它可以工作,但它写在文件的底部。

struct cont 
{
 char lname[20];
 char fname[20];
}s;

void cha(struct cont x)
    {
        FILE *fp;
        char lname[20];
        int flag=0;
        fp=fopen("database.dat","a+");
        if(fp==NULL)
        {
            printf("file error");
        }
        else
        {
            printf("\nenter lname: ");
            gets(lname);

            while(fscanf(fp,"%s %s",x.lname,x.fname)==2)
            {
                if(strcmp(lname,x.lname)==0)
                {
                    printf("enter lname: ");
                    gets(x.lname);
                    printf("enter fname: ");
                    gets(x.fname);

                    fseek(fp,-sizeof(x),SEEK_CUR);
                    fprintf(fp,"%s %s\n",x.lname,x.fname);
                    flag=1;
                    break;

                }
            }

            if(flag==1)
            {
                printf("success!");
            }

            else
            {
                printf("data not found.");
            }
        }
        fclose(fp);
    }

2 个答案:

答案 0 :(得分:4)

fp=fopen("database.dat","r");

您已在读取模式下打开文件,并且您正在尝试写入文件

fprintf(fp,"%s %s\n",x.lname,x.fname);

使用a+以附加模式打开文件。

gets()不再是标准,并使用fgets()来处理缓冲区溢出。

男人说:

  

A +

     
    

打开阅读和追加(在文件末尾写)。该文件是     如果它不存在则创建。读取的初始文件位置是     在文件的开头,但输出始终附加到结尾     该文件。

  

答案 1 :(得分:1)

只需将其写入另一个文件

即可
FILE *newFile = fopen("newDatabase.dat","w");

if(strcmp(lname,x.lname)==0)
{
    //scan data to tmp var
    fprintf(newFile ,"%s %s\n",x2.lname,x2.fname);
}
else
{
    //write original var
    fprintf(newFile ,"%s %s\n",x.lname,x.fname);

}

然后,您可以更改新文件的名称,以覆盖旧文件的重要名称