谭浩强C程序设计第四版第十章课后答案

1.文件型指针,指向文件结构体的指针,文件结构体在文件打开之后自动填充其中的内容。文件指针可以方便的对文件进行操作,其中包含的各种文件模式适合于文件的各种操作类型。
2.文件的打开包含打开文件的信息区和文件的缓存区,打开文件将数据写入到缓冲区,关闭文件,缓冲区文件写入文件,关闭缓冲区,关闭信息区。

3.小写转大写

#include <stdio.h>

int main()
{
	FILE *fp;
	char filename[10],ch;

	printf("请输入文件名:\n");
	scanf("%s",filename);

	if ((fp = fopen(filename,"w")) == NULL)
	{
		printf("can not open the file: \n");
		return 0;
	}

	ch = getchar();
	printf("输入字符串,结尾以#结束:\n");
	ch = getchar();
	while(ch != '#')
	{
		if ( ch > 'a' && ch < 'z')
		{
			ch = ch - 32;
		}
		putc(ch,fp);
		ch = getchar();
	}
	putc('!',fp);
	fclose(fp);
	return 0;
}

4.文件信息合并

#include <stdio.h>

int main()
{
	FILE *fp1,*fp2,*fp3;
	char ch;
	printf("打开file1.bat\n");
	if ((fp1 = fopen("file1.bat","r")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}
	printf("打开file2.bat\n");
	if ((fp2 = fopen("file2.bat","r")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}
	printf("打开file3.bat\n");
	if ((fp3 = fopen("file3.bat","w")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}
	printf("file1.bat的内容\n");
	while (!feof(fp1))
	{
		ch = fgetc(fp1);
		fputc(ch,fp3);
		putchar(ch);
	}
	printf("file2.bat的内容\n");
	while (!feof(fp2))
	{
		ch = fgetc(fp2);
		fputc(ch,fp3);
		putchar(ch);
	}
	putchar(10);
	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
}

5.文件与结构体

#include <stdio.h>

struct student{
	int num;
	char name[10];
	float score[3];
}stu[5];

int main()
{
	FILE *fp;
	for (int i = 0; i < 5;i++)
	{
		printf("请输入第%d个学生的学号姓名以及三门课程的成绩:\n",i+1);
		scanf("%d%s%f%f%f",&stu[i].num,&stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
	}
	//向二进制文件读入一组数据
	if ((fp = fopen("stu.txt","w")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}
	float aver;
	fprintf(fp,"学号\t姓名\t分数1  分数2  分数3  平均分\n");
	for (int i = 0;i < 5;i++)
	{
		/*if (fwrite(&stu[i],sizeof(struct student),1,fp) != 1)
		{
		printf("文件写入出错\n");
		}*/
		aver = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];
		aver /= 3.0;
		fprintf(fp,"%d\t%s\t%5.2f  %5.2f  %5.2f  %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver);
	}
		return 0;
}

6.先排序再存入

#include <stdio.h>

struct student{
	int num;
	char name[10];
	float score[3];
}stu[5];

int main()
{
	FILE *fp1,*fp2;
	float aver[5];
	struct student temp1;
	float temp2;
	//读入stu的数据
	if ((fp1 = fopen("stu.txt","r")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}
	for (int i = 0; i < 5;i++)
	{
		//printf("读入第%d个学生的学号、姓名、成绩、平均分:\n",i+1);
		fscanf(fp1,"%d %s %f %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&aver[i]);
		printf("%d\t%s\t%5.2f  %5.2f  %5.2f  %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver[i]);
	}


	//平均分排序处理
	for (int i = 0;i < 4;i++)
	{
		for (int j = 0;j < 4- i;j++)
		{
			if (aver[j] > aver[j+1] )
			{
				temp2 = aver[j];
				aver[j] = aver[j+1];
				aver[j+1] = temp2;
				temp1 = stu[j];
				stu[j] = stu[j+1];
				stu[j+1] = temp1;
			}
		}
	}

	//写入stu_sort数据
	if ((fp2 = fopen("stu_sort.txt","w")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}
	fprintf(fp2,"学号\t姓名\t分数1  分数2  分数3  平均分\n");
	for (int i = 0;i < 5;i++)
	{
		fprintf(fp2,"%d\t%s\t%5.2f  %5.2f  %5.2f  %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver[i]);
	}

	fclose(fp1);
//	fclose(fp2);
		return 0;

}

7.插入文件

#include <stdio.h>

struct student{
	int num;
	char name[10];
	float score[3];
}stu[5];

int main()
{
	FILE *fp1,*fp2;
	float aver[5];
	struct student temp1;
	float temp2;
	//读入stu的数据
	if ((fp1 = fopen("stu.txt","r")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}
	for (int i = 0; i < 5;i++)
	{
		//printf("读入第%d个学生的学号、姓名、成绩、平均分:\n",i+1);
		fscanf(fp1,"%d %s %f %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&aver[i]);
		printf("%d\t%s\t%5.2f  %5.2f  %5.2f  %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver[i]);
	}


	//平均分排序处理
	for (int i = 0;i < 4;i++)
	{
		for (int j = 0;j < 4- i;j++)
		{
			if (aver[j] > aver[j+1] )
			{
				temp2 = aver[j];
				aver[j] = aver[j+1];
				aver[j+1] = temp2;
				temp1 = stu[j];
				stu[j] = stu[j+1];
				stu[j+1] = temp1;
			}
		}
	}

	//写入stu_sort数据
	if ((fp2 = fopen("stu_sort.txt","w")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}
	fprintf(fp2,"学号\t姓名\t分数1  分数2  分数3  平均分\n");
	for (int i = 0;i < 5;i++)
	{
		fprintf(fp2,"%d\t%s\t%5.2f  %5.2f  %5.2f  %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],aver[i]);
	}

	fclose(fp1);
//	fclose(fp2);
		return 0;

}
#include <stdio.h>

struct student{
	int num;
	char name[10];
	float score[3];
	float aver;
}stu[6];

int main()
{
	FILE *fp1;
	struct student temp1;
	int i = 0;
	//读入需要插入的数据
	printf("输入需要插入的学生数据\n");

	scanf("%d%s%f%f%f",&temp1.num,&temp1.name,&temp1.score[0],&temp1.score[1],&temp1.score[2]);
	temp1.aver = (temp1.score[0] + temp1.score[1] + temp1.score[2])/3.0;

	//打开文件
	if ((fp1 = fopen("stu_sort.txt","r")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}

	for ( i = 0; i < 5;i++)
	{
		fscanf(fp1,"%d %s %f %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2],&stu[i].aver);
	}


	for ( i = 4;i >= 0 && temp1.aver < stu[i].aver;i--)
	{
		stu[i+1] = stu[i];
	}

	stu[i+1] = temp1;

	if ((fp1 = fopen("stu_sort.txt","w")) == NULL)
	{
		printf("打开文件失败:\n");
		return -1;
	}

	for (int i = 0;i < 6;i++)
	{
		fprintf(fp1,"%d\t%s\t%5.2f  %5.2f  %5.2f  %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
		printf("%d\t%s\t%5.2f  %5.2f  %5.2f  %5.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].aver);
	}
	fclose(fp1);
	return 0;

}

9.部分数据转存

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

struct employee{
	char name[10];
	int id;
	char sex;
	int age;
	char addr[10];
	int money;
	char health;
	char edu;
}emp[10];

struct Need
{
	char name[10];
	int salary;
}need[10];

int main()
{
	FILE *fp,*fp1;
	int i;
	if ((fp = fopen("employee.bat","r")) == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}
	for ( i = 0;fread(&emp[i],sizeof(struct employee),1,fp)!=0;i++)
	{
		strcpy(need[i].name,emp[i].name);
		need[i].salary = emp[i].money;

	}
	if ((fp = fopen("salary.bat","w")) == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}
	for (int j = 0;j <i;j++)
	{
		if (fwrite(&need[i],sizeof(Need),1,fp1) != 1)
		{
			printf("error");
		}
	}

	fclose(fp1);
	fclose(fp);

	return 0;

}

10.删除部分数据

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

struct employee{
	char name[10];
	int id;
	char sex;
	int age;
	char addr[10];
	int money;
	char health;
	char edu;
}emp[10];


int main()
{
	FILE *fp;
	int i,id;
	int no;
	if ((fp = fopen("employee.bat","r")) == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}
	printf("输入需要删除的id:");
	scanf("%d",&id);
	for ( i = 0;fread(&emp[i],sizeof(struct employee),1,fp)!=0;i++)
	{
		if (emp[i].id == id)
		{
			no = i;
		}
	}
	for (int j = no;j<i-1;j++)
	{
		emp[j] = emp[i+1];
	}
	
	if ((fp = fopen("employee.bat","w")) == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}

	for (int j = 0;j < i - 1;j++)
	{
		if (fwrite(&emp[i],sizeof(emp),1,fp) != 1)
		{
			printf("error");
		}
	}

	fclose(fp);

	return 0;

}

11.字符串处理

#include <stdio.h>

int main()
{
	char string[10][10];
	FILE *fp;
	if ((fp = fopen("file1.txt","w")) == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}
	for (int i = 0;i < 10;i++)
	{
		gets(string[i]);
		fprintf(fp,"%s\n",string[i]);
	}
	if ((fp = fopen("file1.txt","r")) == NULL)
	{
		printf("打开文件失败\n");
		return -1;
	}
	for (int i = 0;i < 10;i++)
	{
		fscanf(fp,"%s",string[i]);
		for (int j = 0;string[i][j] != '\0';j++)
		{
			if ( string[i][j] >= 'a' && string[i][j] <= 'z')
			{
				string[i][j] -= 32;
			}
		}
		printf("%s\n",string[i]);
	}
	fclose(fp);
	return 0;

}

总结:
有几个问题:
1.二进制文件的读写使用fread,fwrite,对比于非二进制fprintf 和 fscanf速度快,但是输出的文件看不出效果
2.对于文件的读写
r+具有读写属性,从文件头开始写,保留原文件中没有被覆盖的内容

w+具有读写属性,写的时候如果文件存在,会被清空,从头开始写。
r 打开只读文件,该文件必须存在。

r+ 打开可读写的文件,该文件必须存在。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。

a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值