如何用C语言修改文本文件某一行内容?

遇到的问题:修改完后查看文件,确实是修改了,但是总会重复最后一行的内容,查不出问题。

代码的目的:输入要修改的学生序号,修改其分数。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<string.h>
struct stu{
char num[10];
char mark[6];
};

void main()
{
FILE *in;
FILE *out;

char *snum;
char *smark;


struct stu stu1={"101","75"};
struct stu stu2={"102","75"};
struct stu stu3={"103","75"};
struct stu stu4={"104","75"};
struct stu stu5={"105","75"};
struct stu stu6={"106","75"};

in=fopen("c:\\in.txt","w");
if(in==NULL)
{
    printf("error to open in.txt\n");
}

fprintf(in,"%s %s\n",stu1.num,stu1.mark);
fprintf(in,"%s %s\n",stu2.num,stu2.mark);
fprintf(in,"%s %s\n",stu3.num,stu3.mark);
fprintf(in,"%s %s\n",stu4.num,stu4.mark);
fprintf(in,"%s %s\n",stu5.num,stu5.mark);
fprintf(in,"%s %s\n",stu6.num,stu6.mark);
fclose(in);


out=fopen("c:\\out.txt","wt+");
if(out==NULL)
{
    printf("error to open out.txt\n");
}


in=fopen("c:\\in.txt","r");
if(in==NULL)
{
    printf("error to open in.txt\n");
}

printf("input the to be changed num\n");
gets(snum);
printf("input the after changed mark\n");
gets(smark);
struct stu tmp;
while(!feof(in))
{
    fscanf(in,"%s %s",tmp.num,tmp.mark);
    if(strcmp(tmp.num,snum)==0)
    {
        strcpy(tmp.mark,smark);
    }
    fprintf(out,"%s %s\n",tmp.num,tmp.mark);
}
fclose(in);
fclose(out);
unlink("c:\\in.txt");
rename("c:\\out.txt","c:\\in.txt");
printf("ok\n");
getch();

}

修改处见注释,供参考:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<string.h>
struct stu{
    char num[10];
    char mark[6];
};

void main()
{
    FILE *in;
    FILE *out;

    char snum[10];  //修改
    char smark[6];  //修改

    struct stu stu1={"101","75"};
    struct stu stu2={"102","75"};
    struct stu stu3={"103","75"};
    struct stu stu4={"104","75"};
    struct stu stu5={"105","75"};
    struct stu stu6={"106","75"};

    in=fopen("d:\\in.txt","w");
    if(in==NULL)
    {
        printf("error to open in.txt\n");
    }
    fprintf(in,"%s %s\n",stu1.num,stu1.mark);
    fprintf(in,"%s %s\n",stu2.num,stu2.mark);
    fprintf(in,"%s %s\n",stu3.num,stu3.mark);
    fprintf(in,"%s %s\n",stu4.num,stu4.mark);
    fprintf(in,"%s %s\n",stu5.num,stu5.mark);
    fprintf(in,"%s %s\n",stu6.num,stu6.mark);
    fclose(in);


    out=fopen("d:\\out.txt","wt+");
    if(out==NULL)
    {
        printf("error to open out.txt\n");
    }

    in=fopen("d:\\in.txt","r");
    if(in==NULL)
    {
        printf("error to open in.txt\n");
    }

    printf("input the to be changed num\n");
    gets(snum);
    printf("input the after changed mark\n");
    gets(smark);
    struct stu tmp;
    while(1)               //while(!feof(in)) 修改
    {
         if (fscanf(in,"%s %s",tmp.num,tmp.mark) == 2){ //修改
             if(strcmp(tmp.num,snum)==0)
             {
                  strcpy(tmp.mark,smark);
             }
             fprintf(out,"%s %s\n",tmp.num,tmp.mark);
         }
         else          //修改
             break;    //修改
    }
    fclose(in);
    fclose(out);
    unlink("d:\\in.txt");
    rename("d:\\out.txt","d:\\in.txt");
    printf("ok\n");
    getch();
}