C语言 问题 读取文件的数据并排序后写入另一个文件。(要用结构)
小弟就是遇到这个问题,一个是TXT文件,一个是二进制文件,两个文件里各有5个同学的名字和分数。格式是这样的ZhangSan100LiSi99......现在要求从这两个文...
小弟就是遇到这个问题,一个是TXT文件,一个是二进制文件,两个文件里各有5个同学的名字和分数。
格式是这样的
Zhang San
100
Li Si
99
......
现在要求从这两个文件里读取出来一共10个同学的名字和分数,然后把10个分数排序后(连同名字)分别记录在两个新的文件里,一个是TXT,一个是二进制文件。
注意是名字一行 然后另起一行分数 再另起一行 名字 这样。
结构定义:
struct stu {
char name[30];
int grade; };
二进制文件中,每条学生记录长sizeof(struct stu)个字节。姓名最长30个字符(含结束标识符’\0’),姓名中有空格(如Li Gang),分数为整数。
拜托了,总有很多细节搞不懂啊,求达人。
答案好追加~~
2楼加了 展开
格式是这样的
Zhang San
100
Li Si
99
......
现在要求从这两个文件里读取出来一共10个同学的名字和分数,然后把10个分数排序后(连同名字)分别记录在两个新的文件里,一个是TXT,一个是二进制文件。
注意是名字一行 然后另起一行分数 再另起一行 名字 这样。
结构定义:
struct stu {
char name[30];
int grade; };
二进制文件中,每条学生记录长sizeof(struct stu)个字节。姓名最长30个字符(含结束标识符’\0’),姓名中有空格(如Li Gang),分数为整数。
拜托了,总有很多细节搞不懂啊,求达人。
答案好追加~~
2楼加了 展开
5个回答
展开全部
我来回答吧:
首先是两个输入文件:
一个文本文件: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之类的文本编辑器,查看其二进制代码。
首先是两个输入文件:
一个文本文件: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之类的文本编辑器,查看其二进制代码。
展开全部
建议将char name[30]; 改为char name[32];
把两个文件的数据读取出来,然后把数据解析出来并保持。再把数据排序。然后把数据写到新的文件中。
把两个文件的数据读取出来,然后把数据解析出来并保持。再把数据排序。然后把数据写到新的文件中。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-01-06
展开全部
统计
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
加qq125671116
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询