C语言 文件操作专项练习

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次把它复制到另一个文件上

  •     void rewind(FILE *stream)
  •     设置文件位置为给定流stream的文件的开头
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;
}

 

你可能感兴趣的:(C语言)