1.文件中存储的学生信息按照班级编号升序排列,每个班级的人数可以不同,要求读取文件中所有学生的成绩,计算每个班级的平均成绩,将班级编号和平均成绩输出。
存储格式:
145811 fuxin 100
145811 chengxian 90
145812 zhangxue 92
145812 lijun 88
145813 ha 100
145813 hd 300
145813 hf 200
#include
#include
int main()
{
int num=0; //班级人数计数
int sumScore =0; //累计成绩
int curClass=0; //当前班级
int curScore=0; //当前成绩
int lastClass=0; //上一个班级
int readItems=0; //正确读入数据数目
FILE *fin; //输入文件
fin=fopen("score.dic","r");
if(!fin) //文件打开失败
{
fprintf(stderr,"error open file!"); //输出错误信息到标准输出
exit(-1); //强制退出,并返回错误码
}
lastClass=0;
char s[100];
while((readItems=fscanf(fin,"%d %*s %d",&curClass,&curScore))!=EOF) //*表示跳过
{
if(readItems!=2)
break;
if(lastClass==curClass||lastClass==0)
{
num++;
sumScore +=curScore;
lastClass=curClass;
}
else
{
if(num==0)
return 0;
printf("%d\t%d\n",lastClass,sumScore/num);
sumScore=curScore;
lastClass=curClass;
num=1;
}
}
printf("%d\t%d\n",lastClass,sumScore/num);
fclose(fin);
}
2.用fgetc函数从键盘逐个输入字符,然后用fputc函数写到磁盘文件即可
#include
#include
int main()
{
FILE *fp;
char ch;
if((fp=fopen("file.dat","w"))==NULL)
{
printf("error open file");
exit(1);
}
printf("请输入字符串,以#结束:\n");
while((ch=getchar())!='#')
{
fputc(ch,fp);
putchar(ch); //在屏幕上显示字符
}
fclose(fp);
putchar(10); //向屏幕输出一个换行符
return 0;
}
3.将一个磁盘文件中的信息复制到另一个磁盘文件中
int main()
{
FILE *fin,*fout;
int ch;
fin=fopen("fin.dat","r");
fout=fopen("fout.dat","w");
if(fin==NULL||fout==NULL)
{
fprintf(stdin,"error open files");
}
while((ch=fgetc(fin))!=EOF) //注意ch是int类型
fputc(ch,fout);
fclose(fin);
fclose(fout);
printf("复制文件成功");
return 0;
}
如果使用feof()函数判断是否到达文件末尾,需要注意先读取再判断是否到文件尾, 也就是说在它之前一定要读一次才能做出判断。因为在读完文件的最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多执行了一次。
//错误,多输出一行FF
while(!feof(fp))
{
c = fgetc(fp);
printf("%X\n",c);
}
//正确
c = fgetc(fp);
while(!feof(fp))
{
printf("%X\n",c);
c = fgetc(fp);
}
4 从键盘读入若干字符,对它们按照字母大小排序,然后把排好序的字符串送到磁盘文件保存
#define MAXSIZE 1000
int main()
{
FILE *fp;
char str[MAXSIZE];
int ch;
int i;//字符个数
if((fp=fopen("file.dat","w"))==NULL)
{
printf("error open file");
exit(1);
}
i=0;
//从键盘获取数据
while((ch=getchar())!=EOF)
{
if(i==(MAXSIZE))
{
if(fputs(str,fp)==EOF)//向文件输入数据
{
printf("error output to file");
exit(1);
}
i=0;
}
//插入排序
if(i==0)
{
str[i]=ch;
}
else
{
int j;
for(j=i-1;j>=0&& ch0)
fputs(str,fp);
fclose(fp);
return 0;
}
5 从键盘读入若干字符串,对它们按照字母大小排序,然后把排好序的字符串送到磁盘文件保存
#include
#include
#include
#define MAXLINES 100 //最大行数
#define MAXLEN 1000 //一行最大长度
char *lineptr[MAXLINES]; //指向字符串的指针数组
//返回长度
int getline(char*s,int lim)
{
int c;
char *t=s;
while(--lim>0&&(c=getchar())!=EOF &&c!='\n')
*s++=c;
if(c =='\n')
*s++=c;
*s='\0';
return s-t;
}
int readlines(char *lineptr[],int maxlines)
{
int len,nlines;
char *p,line[MAXLINES];
nlines=0;
while((len=getline(line,MAXLEN))>0)
if(nlines>=maxlines ||(p=(char*)malloc(sizeof(len)))==NULL)
return -1;
else
{
line[len-1]='\0';
strcpy(p,line);
lineptr[nlines++]=p;
}
return nlines;
}
void writeline(char*lineptr[],int nlines,FILE *fp)
{
while(nlines-->0)
{
printf("%s\n",*lineptr);
fputs(*lineptr++,fp);
fputs("\n",fp);//输入换行符
}
}
void swap(char *v[],int i,int j)
{
char *temp;
temp=v[i];
v[i]=v[j];
v[j]=temp;
}
void qsort(char *v[],int left,int right)
{
int i,last;
if(left>right)
return;
swap(v,left,(left+right)/2);
last=left;
for(i=left+1;i<=right;i++)
if(strcmp(v[i],v[left])<0)
swap(v,++last,i);
swap(v,left,last);
qsort(v,left,last-1);
qsort(v,last+1,right);
}
int main()
{
FILE *fp;
if((fp=fopen("file.dat","w"))==NULL)
{
printf("error open file");
exit(1);
}
printf("Enter strings:\n");
int nlines;//读取行数
if((nlines=readlines(lineptr,MAXLINES))>0)
{
qsort(lineptr,0,nlines-1);
writeline(lineptr,nlines,fp);
}
else
{
printf("error input");
}
fclose(fp);
}
6 从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去
#define SIZE 10
struct Student_type{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE]; //全局结构体数组
void save()
{
FILE*fp;
int i,j;
if((fp=fopen("student.dat","wb"))==NULL)
{
printf("error open file\n");
exit(1);
}
for(i=0;i
7 有一个磁盘文件,内有一些信息。要求第一次将它的内容显示在屏幕上,第2次把它复制到另一个文件上
int main()
{
FILE *fp1,*fp2;
fp1=fopen("fin.dat","r");
fp2=fopen("fout.dat","w");
if(!fp1||!fp2)
{
printf("error open file");
exit(1);
}
while(!feof(fp1))
{
putchar(getc(fp1));
}
putchar(10);//换行
rewind(fp1);//使文件位置标记返回文件头
while(!feof(fp1))
{
putc(getc(fp1),fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
8 在磁盘文件上存有10个学生的数据区的开头,从磁盘文件读入相应学生的信息,并把它显示在屏幕上
#define SIZE 10
struct Student_type{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
int main()
{
int i;
FILE *fp;
if((fp=fopen("student.dat","rb"))==NULL)
{
printf("error open file");
exit(1);
}
for(i=0;i
9 有两个磁盘文件,各存放一行字母,今要求把这两个文件中的信息合并(按照字母顺序排列),输出到一个新文件中
int main()
{
FILE *fp1,*fp2,*fp3;
fp1=fopen("fin.dat","r");
fp2=fopen("fout.dat","r");
fp3=fopen("file.dat","w");
if(!fp1||!fp2||!fp3)
{
printf("error open file");
exit(1);
}
char c[1000];//存储数据
int i,j,k,ch;
puts("fileA:");
for(i=0;(ch=getc(fp1))!=EOF&&ch!='\n';i++)
{
c[i]=ch;
putchar(c[i]);
}
puts("\nfileB:");
for(;(ch=getc(fp2))!=EOF&&ch!='\n';i++)
{
c[i]=ch;
putchar(c[i]);
}
for(j=0;jc[k+1])
{
int temp=c[k];
c[k]=c[k+1];
c[k+1]=temp;
}
puts("\nfileC:");
for(j=0;j
10 两个班的成绩分别存放在两个班的成绩分别存放在两个文件当中。 每个文件有多行, 每行都是由空格分隔的学号、姓名和成绩。现在要将两个班的成绩合并到一起进行排序按照成绩从高到低,如果相同则按学号由小到大排序。将结果输出一个文件当中。两个输入文件名与输出文件名使用命令行参数指定。请你编写一个程序完成上述功能
#include
#include
#include
#define MAXN 200
struct stuNode
{
char stuID[20];
char name[20];
int score;
};
typedef struct stuNode stuType;
int myCompare(stuType m,stuType n)
{
if(m.score!=n.score)
return n.score-m.score;
else
return strcmp(m.stuID,n.stuID);
}
int cmp(const void *a,const void *b)
{
stuType m=*(stuType*)a, n=*(stuType*)b;
return myCompare(m,n);
}
void loadData(FILE* fp,stuType *m)
{
int i=0;
while(fscanf(fp,"%s",m[i].stuID)!=EOF)
{
fscanf(fp,"%s%d",m[i].name,&m[i].score);
i++;
}
qsort(m,i,sizeof(stuType),cmp);
m[i].score=-1; // set -1 as bounder
}
void merge(stuType *a,stuType *b)
{
stuType tmp[MAXN];
int i=0,j=0,index=0;
while(a[i].score>0 && b[j].score>0)
{
if(myCompare(a[i],b[j])<0)
tmp[index++]=a[i++];
else
tmp[index++]=b[j++];
}
while(a[i].score>0)
tmp[index++]=a[i++];
while(a[i].score>0)
tmp[index++]=b[j++];
tmp[index].score=-1;
for(i=0;i0;i++)
{
fprintf(fout,"%s %s %d\n",a[i].stuID,a[i].name,a[i].score);
}
return 0;
}