我来回答吧:
首先是两个输入文件:
一个文本文件:scoret.txt
一个二进制文件:scoreb.txt
文本文件scoret.txt我们可以直接编辑(按要求编辑五个学生的姓名和成绩),而二进制文件不易编辑。
我们先写一个代码,实再将scoret.txt文件转成二进制文件scoreb.txt
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct stu {
char name[30];
int grade;
};
int main()
{
int i,n;
struct stu s[10];
FILE *fpIt,*fpIb; /*输入*/
FILE *fpOt,*fpOb; /*输出*/
fpIt=fopen("scoret.txt","r");
fpIb=fopen("scoreb.txt","wb");
if (fpIt==NULL || fpIb==NULL)
{
printf("File Open Error:\npress any key to exit:\n");
getch();
return -1;
}
i=0;
while (!feof(fpIt))
{
fgets(s[i].name,30,fpIt); /*有空格只能这样输入*/
fscanf(fpIt,"%d\n",&s[i].grade); /*文本输入*/
printf("i=%d,name=%s\t grade=%d\n",i,s[i].name,s[i].grade);
getch();
fwrite(&s[i],sizeof(struct stu),1,fpIb);
i++;
}
n=i;
printf("n=%d\n",n);
fclose(fpIt);
fclose(fpIb);
getch();
return 0;
}
===============
上面的代码在TC或VC下编辑运行,就可以生成scoreb.txt文件。这时scoreb.txt的学生信息与scoret.txt是一样的。
接着就要修改一下scoret.txt文件的内容,重新编辑5个学生的信息给scoreb.txt
这样使得scoret.txt与scoreb.txt分别各有五个学生的信息。
当然你如果有原始文件的话,上面都是浮云。
下面是你这个问题的重点:
#include <mem.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct stu {
char name[30];
int grade;
};
int main()
{
int i,j,n;
struct stu s[10],temp;
FILE *fpIt,*fpIb; /*输入*/
FILE *fpOt,*fpOb; /*输出*/
fpIt=fopen("scoret.txt","r");
fpIb=fopen("scoreb.txt","rb");
fpOt=fopen("scoreOt.txt","w");
fpOb=fopen("scoreOb.txt","wb");
if (fpIt==NULL || fpIb==NULL || fpOt==NULL || fpOb==NULL)
{
printf("File Open Error:\npress any key to exit:\n");
getch();
return -1;
}
n=0;
while (!feof(fpIt))
{
fgets(s[n].name,30,fpIt); /*有空格只能这样输入*/
fscanf(fpIt,"%d\n",&s[n].grade); /*文本输入*/
printf("n=%d,name=%s\t grade=%d\n",n,s[n].name,s[n].grade);
getch();
n++;
}
fclose(fpIt);
printf("===========\n");
while (!feof(fpIb) && n<10)
{
fread(&s[n],sizeof(struct stu),1,fpIb);
printf("n=%d,name=%s\t grade=%d\n",n,s[n].name,s[n].grade);
getch();
n++;
}
printf("n=%d\n",n);
fclose(fpIb);
/*排序*/
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (s[i].grade<s[j].grade)
{ /*整个结构体复制,如果不用memcpy的话,要先复制name的内容和grade*/
memcpy(&temp,&s[i],sizeof(struct stu));
memcpy(&s[i],&s[j],sizeof(struct stu));
memcpy(&s[j],&temp,sizeof(struct stu));
}
for (i=0;i<n;i++)
printf("%d %s",s[i].grade,s[i].name);
/*写文件*/
for (i=0;i<5;i++)
fprintf(fpOt,"%s%d\n",s[i].name,s[i].grade);
fclose(fpOt);
for (i=5;i<10;i++)
fwrite(&s[i],sizeof(struct stu),1,fpOt);
fclose(fpOt);
getch();
return 0;
}
==============================
总结:
文本文件一般用:
读:fscanf函数或fgets函数,
写:fprintf函数即可(当然也可以用fputs函数)
二进制文件一般用:
读:fread函数
写:fwrite函数。
当然二进制文件你如果用记事本打开的话,一般是乱码。你可以弄一个UltraEdit之类的文本编辑器,查看其二进制代码。
温馨提示:答案为网友推荐,仅供参考