遇到的问题:修改完后查看文件,确实是修改了,但是总会重复最后一行的内容,查不出问题。
代码的目的:输入要修改的学生序号,修改其分数。
#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();
}