大一C语言自主实验_文件

1、程序功能:已知一个数据文件a.txt中保存了若干个学生的计算机等级考试成绩,包括学号、姓名和成绩。请编程读出显示文件内容并分类统计各等级人数,最后显示统计结果。
成绩等级规则:大于等于90-A,大于等于80-B,大于等于70-C,大于等于60-D,60以下-E。

301101   张文    95
301102   陈五    85
301103   程明    75
301104   李文    45
301105   张三    65

/*功能:编程显示数据文件a.txt的文件内容,并分类统计各等级人数,最后显示统计结果。*/
/*提示:除在指定位置添加语句之外,请不要改动程序中的其他内容。					 */

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE  *fp;					/* 文件指针 */   
	int a=0,b=0,c=0,d=0,e=0;	/* 等级人数计数器,初值为0 */
    long num;
	char name[20];
	int score;
  	
	/* 以读方式打开文件 */
    if((fp = fopen("a.txt", "r")) == NULL)
	{ 
        printf("Can't Open File!");
    	exit(0);
    }

	/*在两条星线间填入代码, 读出显示文件内容并分类统计各等级人数*/
	/************************************************************/
    while(!feof(fp))
	{
		/*读出并显示文件当前行的内容*/
		if(fscanf(fp,"%ld%s%d",&num,name,&score)==-1) break;
		printf("%ld   %s  %d\n",num,name,score);

		/*统计各等级人数*/
		if(score>=90)a++;
		else if(score>=80)b++;
		else if(score>=70)c++;
		else if(score>=60)d++;
		else e++;
	}
	/************************************************************/

	fclose(fp);   /*关闭文件*/

	/*输出统计结果*/
	printf("\n等级A的人数:%d.",a);
	printf("\n等级B的人数:%d.",b);
	printf("\n等级C的人数:%d.",c);
	printf("\n等级D的人数:%d.",d);
	printf("\n等级E的人数:%d.\n",e);

	return 0;
}

2、程序功能:已知文件 a.txt 存储若干文本数据,编程统计 a.txt 文件的行数、大写字母个数、小写字母个数、数字字符个数及其他字符的个数。
要求如下:
① 定义 countFile()函数:统计文本文件的行数、大写字母个数、小写字母个数、数字字符个数及其他字符的个数。
② 定义 main()函数:打开 a.txt 文件,调用 countFile()函数统计文本文件的行数、大写字母个数、小写字母个数、数字字符个数及其他字符的个数,输出统计结果。

abcd1234ABCD#$%^
abcd1234ABCD#$%^
abcd1234ABCD#$%^
abcd1234ABCD#$%^
abcd1234ABCD#$%^

/*程序功能:编写函数count_file,统计一个文本文件中的行数、大写字母、小写字母、	*/
/*          数字字符及其他字符的个数。在主函数中打开一个文本文件,然后调用该	*/
/*          函数返回统计结果,最后输出结果。									*/
/*提    示:除在指定位置添加语句之外,请不要改动程序中的其他内容。				*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE  *fp;     
	int line,letter1,letter2,digit,other;  /* 统计变量计数器 */
	int count_file(FILE *fp,int *letter1,int *letter2,int *digit,int *other);  /*函数声明*/
	 
	/*以读方式打开文件*/
    if((fp = fopen("a.txt", "r")) == NULL)
	{ 
        printf("Can't Open File!");
    	exit(0);
    }

	/*调用count_file函数返回分类统计结果*/
	line=count_file(fp,&letter1,&letter2,&digit,&other);

	fclose(fp);   /*关闭文件*/

	/*输出统计结果*/
	printf("\n文件中的行数:%d.\n",line);
	printf("文件中的大写字母个数:%d.\n",letter1);
	printf("文件中的小写字母个数:%d.\n",letter2);
	printf("文件中的数字个数:%d.\n",digit);
	printf("文件中的其他字符个数:%d.\n",other);

	return 0;
}

/*功  能:分类统计文本文件:行数、大写字母数、小写字母数、数字个数及其他字符个数。	*/
/*参  数:fp—文件指针;	letter1、letter2、digit、other—各计数器指针变量		*/
/*返回值:返回行数						                     */
int count_file(FILE *fp,int *letter1,int *letter2,int *digit,int *other)
{
	int line;
	char ch;

	/* 计数器变量初始化为0 */
	line=0,*letter1=0,*letter2=0,*digit=0,*other=0;

    /* 读取文件并分类统计 */
	while(!feof(fp))
	{
		/* 读取一个字符 */
		if((ch=fgetc(fp))==EOF) break;

		/*分类统计*/
		if(ch=='\n')line++;
		else if(ch>='A' && ch<='Z')*letter1=*letter1+1;
		else if(ch>='a' && ch<='z')*letter2=*letter2+1;
		else if(ch>='0' && ch<='9')*digit=*digit+1;
		else *other=*other+1;
	}

	return line+1;		/*返回行数*/
}


3、程序功能:编写一个程序,比较两个文本文件a1.txt和a2.txt的内容是否相同,若相同则输出“YES”,否则输“NO”,并输出两个文件内容首次不同的行号和字符位置 

abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789(&^%$#><?)0123456789(&^%$#><?)12

abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789(&^%$#><?)0123456789(&^%$#><?)

/*功能:比较两个文本文件的内容是否相同,若相同则输出"YES",否则输出"NO",并输出两个文件内容首次不同的  */
/*      行号和字符位置。																			   */
/*要求:编写compareFile函数,比较两个文件内容是否相同,相同返回 0;不同返回1,并给出首次不同的行列位置。*/

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE  *fp1,*fp2;     
	int row=1,col=1,flag;   /* flag:标记文件是否相同,相同flag=0,不同flag=1 */
  	
	int compareFile(FILE *fp1,FILE *fp2,int *prow,int *pcol);	  /* 函数声明 */
	
	/* 打开两个文本文件a1和a2 */
	if((fp1 = fopen("a1.txt", "r")) == NULL || (fp2 = fopen("a2.txt", "r")) == NULL)
	{ 
        printf("Can't Open File!");
    	exit(0);
    }

	/* 调用compareFile函数,返回比较结果 */
	flag=compareFile(fp1,fp2,&row,&col);

	/*输出统计结果:flag=1表示不同,flag=0表示相同*/
	if(flag==1)printf("不同,首次出现不同的行号=%d,列号=%d.\n",row,col);
	else printf("YES.\n");

	/*关闭文件*/
	fclose(fp1);
	fclose(fp2);
	return 0;
}

/*功  能:比较两个文件内容是否相同,相同返回 0;不同返回1,并给出首次不同的行列位置。*/
/*参  数:fp1、fp2—文件指针;	prow、pcol—不同行列位置的指针变量					*/
/*返回值:返回比较结果												                */
 int compareFile(FILE *fp1,FILE *fp2,int *prow,int *pcol)
 {
	 char ch1,ch2;
	 int flag=0;	/* 设置比较结果标志变量初值为0 */

	/*逐个字符比较两个文件内容,判定是否相同*/
	while(!feof(fp1) && !feof(fp2))
	{
		ch1=fgetc(fp1);
		ch2=fgetc(fp2);
		if(ch1!=ch2){ flag=1; break; }										/*不同: 置flag=1并跳出循环*/
		else if(ch1=='\n' && ch2=='\n'){ (*prow)++; (*pcol)=1; continue; }	/*相同并结束一行		  */
		else (*pcol)++;														/*相同未结束一行		  */
	}

	return flag;	/* 返回比较结果 */
 }



4、程序功能:从键盘输入若干个学生数据(包括学号、姓名和成绩)保存到文本文件 a.txt 中(以负数成绩表示输入结束),然后再从该文件中读出并显示。  

1 A 100
2 B 90

/*程序功能:从键盘输入若干个学生的计算机等级考试成绩(包括:学号、姓名和成绩)并保存到文本	*/
/*          文件a.txt中(以负数表示输入结束),然后再从该文件中读出并显示到屏幕。			*/
/*提    示:除在指定位置添加语句之外,请不要改动程序中的其他内容。							*/

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE  *fp;		/* 文件指针fp */
    long num;
	char name[20];
	int score;
  	
	/*以写方式打开文件*/
    if((fp = fopen("a.txt", "w")) == NULL){ 
        printf("Can't Open File!");
    	exit(0);
    }

	/*输入第一个成绩数据*/
	printf("输入若干包括学号、姓名和成绩(以负数结束):\n");
	scanf("%ld%s%d",&num,name,&score);  

	/*在两条星线间填入代码, 从键盘继续输入若干成绩并保存到文件中*/
	/************************************************************/
    while(score>=0)
	{
		fprintf(fp,"%ld%c%s%c%d%c",num,' ',name,' ',score,'\n');
		scanf("%ld%s%d",&num,name,&score);
	}
	/************************************************************/

	fclose(fp);   /*关闭文件*/

	/*以读方式打开文件*/
    if((fp = fopen("a.txt", "r")) == NULL)
	{ 
        printf("Can't Open File!");
    	exit(0);
    }

	/*输出文件内容*/
	printf("输出文件内容如下:\n");
	fscanf(fp,"%ld%s%d",&num,name,&score);		/*读第一条数据*/

	//在两条星线间填入代码, 读出文件内容并显示到屏幕		  */
	/**********************************************************/
    while(!feof(fp))
	{
		printf("%ld  %s  %d\n",num,name,score);	/*显示一条数据*/
		fscanf(fp,"%ld%s%d",&num,name,&score);	/*读下一条数据*/
	}
	/**********************************************************/

	fclose(fp);   /*关闭文件*/

	return 0;
}

5、程序功能:从键盘输入10个英文单词到二维字符数组a并保存到文本文件a.txt中(单词间以空格分隔),然后再从该文件中读出所有单词并显示到屏幕。

/*程序功能:从键盘输入10个英文单词到二维字符数组a并保存到文本文件a.txt中(单词间以空格分隔)*/
/*          然后再从该文件中读出所有单词并显示到屏幕。										*/
/*提    示:除在指定位置添加语句之外,请不要改动程序中的其他内容。							*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10

int main()
{
    FILE  *fp;
    char a[N][80],strout[80];
	int i;
  	
	/*以写方式打开文件*/
    if((fp = fopen("a.txt", "w")) == NULL)
	{ 
        printf("Can't Open File!");
    	exit(0);
    }

	printf("请输入%d个以空格分隔的单词:\n",N);

	/*在两条星线间填入代码, 从键盘输入10个以空格分隔的单词到数组*/
	/*并保存到文件中											*/
	/************************************************************/
    for(i=0;i<N;i++)
	{
		scanf("%s",a[i]);
		fputs(a[i],fp);
	}
	/************************************************************/

	fclose(fp);   /*关闭文件*/

	/*以读方式打开文件*/
    if((fp = fopen("a.txt", "r")) == NULL){ 
        printf("Can't Open File!");
    	exit(0);
    }

	printf("显示文件中的单词:\n");
	/*在两条星线间填入代码, 读出文件内容并显示到屏幕			*/
	/************************************************************/
    i=0;
	fgets(strout,strlen(a[i++])+1,fp);			  /*读第一个单词*/
	while(!feof(fp))
	{
		puts(strout);							  /*显示一个单词*/
		fgets(strout,strlen(a[i++])+1,fp);		  /*读下一个单词*/
	}
	/************************************************************/

	fclose(fp);   /*关闭文件*/

	return 0;
}

  

 6、程序功能:从键盘输入若干个学生数据(包括学号、姓名和成绩)保存到二进制文件 a.dat(以负数成绩表示输入结束),然后再从该文件中读出并显示。

/*程序功能:从键盘输入若干个学生数据(包括学号、姓名和成绩)保存到二进制文件 a.dat */
/*          (以负数成绩表示输入结束),然后再从该文件中读出并显示。			   */
/*提    示:除在指定位置添加语句之外,请不要改动程序中的其他内容。				   */

#include <stdio.h> 
#include <stdlib.h> 

struct Student{		/* 学生结构体 */ 
	long num;		/* 学号 */ 
	char name[20];	/* 姓名 */ 
	int score;		/* 成绩 */ 
};

int main() 
{ 
	FILE *fp; /* 文件指针 */ 
	struct Student stu; /* 结构变量 */ 
 
	if((fp=fopen("a.dat","wb"))==NULL){ /* 以写方式打开文件 */ 
		printf("Can't Open File!"); 
		exit(0); 
	} 
 
	printf("输入若干包括学号、姓名和成绩(以负数成绩结束输入):\n"); 
	/* 在两条星线间填入代码,从键盘继续输入若干成绩并保存到文件           */ 
	/**********************************************************************/
	scanf("%ld%s%d",&stu.num,stu.name,&stu.score);		/* 输入第一条记录 */
	while(stu.score>=0){
		fwrite(&stu,sizeof(stu),1,fp);					/* 写入一条记录   */
		scanf("%ld%s%d",&stu.num,stu.name,&stu.score);	/* 输入下一条记录 */
	}
	/**********************************************************************/
	
	fclose(fp); /* 关闭文件 */ 
 
	if((fp=fopen("a.dat","rb"))==NULL){ /* 以读方式打开文件 */ 
		printf("Can't Open File!"); 
		exit(0); 
	} 
 
	printf("输出文件内容如下:\n"); 
	/* 在两条星线间填入代码,读出文件内容并显示到屏幕                 */ 
	/**********************************************************************/
	fread(&stu,sizeof(stu),1,fp);						  /* 读取第一记录 */
	while(!feof(fp)){
		printf("%ld %s %d\n",stu.num,stu.name,stu.score); /* 输出一条记录 */
		fread(&stu,sizeof(stu),1,fp);					  /* 读取下一记录 */
	}
	/**********************************************************************/
 
	fclose(fp); /* 关闭文件 */ 
	return 0; 
}

 7、程序功能:两个非空二进制文件 a1.dat 和 a2.dat,分别保存若干学生数据(包括学号、姓名和成绩),且按成绩升序排列。编写程序,把 a1.dat 和 a2.dat 两个文件归并到 a3.dat 文件,使得 a3.dat 文件中的学生数据也按成绩升序排列。
要求如下:
① 定义 mergeFile()函数:将两个二进制文件归并成一个按成绩升序排列的新文件。
② 定义 main()函数:先打开二进制文件 a1.dat、a2.dat、a3.dat,再调用 mergeFile()函数将 a1.dat、a2.dat 两个文件归并到按成绩升序排列的 a3.dat 文件,最后输出 a3.dat 文件内容。

/*程序功能:两个非空文件a1.dat 和a2.dat中包含若干升序排列的整数,编写一个程序,把a1.dat和	*/
/*          a2.dat两个文件中的数据合并到a3.dat文件,使得a3.dat中的数据也按升序排列。		*/

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>

struct Student{		/* 学生结构体 */ 
	long num;		/* 学号 */ 
	char name[20];	/* 姓名 */ 
	int score;		/* 成绩 */ 
};

int main()
{
    FILE  *fp1,*fp2,*fp3;
	struct Student stu;								/* 结构变量 */ 

	void inputData();								/* 函数声明:输入数据函数 */
	void mergeFile(FILE *fp1,FILE *fp2,FILE *fp3);	/* 函数声明:归并文件函数 */
	void display();									/* 函数声明:显示文件函数 */

	inputData();									/* 调用inputData函数,输入学生数据 */
	
	/*以读方式打开a1.dat文件*/
    if((fp1=fopen("a1.dat","rb"))==NULL){
        printf("Can't Open a1.dat File!");
    	exit(0);
    }

	/*以读方式打开a2.dat文件*/
    if((fp2=fopen("a2.dat","rb"))==NULL){
        printf("Can't Open a1.dat File!");
    	exit(0);
    }

	/*以写方式打开a3.dat文件*/
    if((fp3=fopen("a3.dat","wb"))==NULL){ 
        printf("Can't Open a3.dat File!");
    	exit(0);
    }

	mergeFile(fp1,fp2,fp3);		/* 调用mergeFile函数,归并文件 */

	display();					/* 调用display函数,显示文件内容 */

	return 0;
}

/*功  能:在两个文件中依次输入一批按成绩升序的学生数据。*/
/*参  数:无											*/
/*返回值:无							                */
void inputData() 
{
	int i;
	char fileName[20],str[2];
    FILE  *fp;
	struct Student stu;

	/*输入两个文件内容*/
	for(i=1;i<=2;i++){
		itoa(i,str,10);
		strcpy(fileName,"a");
		strcat(strcat(fileName,str),".dat");

	    if((fp=fopen(fileName,"wb"))==NULL)		{ 
			printf("Can't Open File!");
    		exit(0);
		}

		printf("在a%d.dat文件中输入一批按成绩升序的学生数据:\n",i); 
		printf("请依次输入学号、姓名和成绩(以负数成绩结束输入):\n"); 
		scanf("%ld%s%d",&stu.num,stu.name,&stu.score);		/* 输入第一条记录 */
		while(stu.score>=0){
			fwrite(&stu,sizeof(stu),1,fp);					/* 写入一条记录   */
			scanf("%ld%s%d",&stu.num,stu.name,&stu.score);	/* 输入下一条记录 */
		}
	
		fclose(fp); /* 关闭文件 */ 
	}
}

/*功  能:依次输出三个文件中的学生数据。*/
/*参  数:无				            */
/*返回值:无		                    */
void display()
{
	int i;
	char fileName[20],str[2];
    FILE  *fp;
	struct Student stu;

	/*输出三个文件内容*/
	for(i=1;i<=3;i++){
		itoa(i,str,10);
		strcpy(fileName,"a");
		strcat(strcat(fileName,str),".dat");

	    if((fp=fopen(fileName,"rb"))==NULL){ 
			printf("Can't Open File!");
    		exit(0);
		}
		printf("\na%d.dat文件内容:\n",i);
		fread(&stu,sizeof(stu),1,fp);						  /* 读取第一记录 */
		while(!feof(fp)){
			printf("%-4ld %-4s %-4d\n",stu.num,stu.name,stu.score); /* 输出一条记录 */
			fread(&stu,sizeof(stu),1,fp);					  /* 读取下一记录 */
		}

		fclose(fp);		/* 关闭文件 */
	}
}

/*功  能:按成绩升序归并fp1和fp2两个文件生成fp3文件,使得第fp3文件有序。*/
/*参  数:fp1、fp2、fp3—文件指针										*/
/*返回值:无												            */
 void mergeFile(FILE *fp1,FILE *fp2,FILE *fp3)
 {
	struct Student stud,stu1,stu2;

	/*读取两个文件中第1条数据*/
	fread(&stu1,sizeof(stud),1,fp1);
	fread(&stu2,sizeof(stud),1,fp2);

	/*归并fp1和fp2两个文件中的数据到fp3文件,使fp3文件有序    */
	while(!feof(fp1) && !feof(fp2))				/*fp1和fp2都没结束*/
	{
		if(stu1.score<stu2.score){
			fwrite(&stu1,sizeof(stud),1,fp3);	/* 写入stu1中记录  */;
			fread(&stu1,sizeof(stud),1,fp1);	/* 读取fp1下条记录 */
		}
		else{
			fwrite(&stu2,sizeof(stud),1,fp3);	/* 写入stu2中记录  */;
			fread(&stu2,sizeof(stud),1,fp2);	/* 读取fp2下条记录 */
		}
	}

	if(feof(fp1)){
		fwrite(&stu2,sizeof(stud),1,fp3);		/* 写入stu2中记录  */
		fread(&stu2,sizeof(stud),1,fp2);		/* 读取fp2下条记录 */
		while(!feof(fp2)){
			fwrite(&stu2,sizeof(stud),1,fp3);	/* 写入stu2中记录  */
			fread(&stu2,sizeof(stud),1,fp2);	/* 读取fp2下条记录 */
		}
	}
	else{
		fwrite(&stu1,sizeof(stud),1,fp3);		/* 写入stu2中记录  */
		fread(&stu1,sizeof(stud),1,fp1);		/* 读取fp1下条记录 */
		while(!feof(fp1)){
			fwrite(&stu1,sizeof(stud),1,fp3);	/* 写入stu2中记录  */
			fread(&stu1,sizeof(stud),1,fp1);	/* 读取fp1下条记录 */
		}
	}

	/*关闭打开的三个文件*/
	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
}

  • 7
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值