文件

一.任务代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
	char name1[20];
	char name2[20];
	char num[20];
	char sex[10];
	char grade[10];
	int score;
};
struct student students[11];
void Space(int num);
void write();
void read();
int main() {
	system("color f4");
	printf("   Welcome to this wonderful world!    \n");
	while (1)
	{
		Space(20);
		printf("******************请输入符号选择你所需要的功能*******************\n");
		Space(20);
		printf("|                            1.WRITE                             |\n");
		Space(20);
		printf("|                             2.READ                             |\n");
		Space(20);
		printf("|                             3.EXIT                             |\n");
		Space(20);
		printf("*****************************************************************\n");
		int choice;
		scanf("%d", &choice);
		switch (choice) {
		case 1:write();
			break;
		case 2:read();
			break;
		case 3:printf("Thanks!\n");
			return 0;
			break;
		}
		system("pause");//冻结窗口 
		system("cls");//清屏
	}
	return 0;
}

void write() {
	FILE* fp;
	char name2[10];
	int i = 0;
	printf("姓名:\n");
	scanf("%s", students[i].name2);
	strcpy(students[i].name1, students[i].name2);
	strcat(students[i].name1, ".txt");
	if ((fp = fopen(students[i].name1, "w")) == NULL)//判断是否正常打开文件
	{
		printf("Can not open the file!\n");
		exit(0);
	}
	printf("学号:\n");
	scanf("       %s", students[i].num);
	printf("性别:\n");
	scanf("       %s", students[i].sex);
	printf("班级:\n");
	scanf("       %s", students[i].grade);
	printf("线代成绩:\n");
	scanf("           %d", &students[i].score);
	fp = fopen(students[i].name1, "a+");
	fprintf(fp, "%s    %s     %s     %d\n", students[i].num, students[i].sex, students[i].grade, students[i].score);
	if (fclose(fp)) {             //判断是否能正常关闭文件
		printf("Can not close the file!\n");
		exit(0);
	}
}
void read()
{
	FILE* fp;
	int j = 0;
	char name1[10], name2[10];
	printf("姓名:\n");
	scanf("%s", name1);
	strcpy(name2, name1);
	strcat(name1, ".txt");
	if ((fp = fopen(name1, "r")) == NULL)
	{
		printf("Can not open the file!\n");
		exit(0);
	}
	strcpy(name1, name2);
	strcat(name1, ".txt");
	fp = fopen(name1, "r");
	fscanf(fp, "%s    %s    %s    %d", students[j].num, students[j].sex, students[j].grade, &students[j].score);
	printf("姓名:%s   学号:%s   性别:%s   班级:%s   线代成绩:%d\n", name2, students[j].num, students[j].sex, students[j].grade, students[j].score);
	fclose(fp);           //关闭文件
	system("pause");     //冻结窗口
}

void Space(int num) {
	for (int i = 0; i < num; i++) {
		printf(" ");
	}

}

二.运行后的截图:

1.

2.

3.

4.

5.

二.知识点:

1.缓冲区:

定义:缓冲区有时也被称作缓存,和手机app中存在的缓存类似,它存在的目的也为了提高效率。c语言在对一个文件进行操作的时候,先将文件读取到缓冲区,然后对文件的操作都在缓冲区进行,操作完成了之后才将文件写入磁盘。

作用:主要用于就是将cpu释放出来,充分利用cpu的资源。其次因为对内存的操作速度远大于对磁盘的操作速度,这样就提高了效率,同时还减少了对磁盘的读写次数。

三种类型:全缓冲、行缓冲和不带缓冲
1.全缓冲
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。
2.行缓冲
在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。
3.不带缓冲
也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

2.EOF:

概念:eod是end of file的缩写“!=EOF”表示文件还没有结束“=EOF”表示到文件末尾了。在用函数读入文件数据的时候,函数总会返回一个状态,是读取成功还是失败,那么这个状态怎么表示呢,所以就约定俗成定义一个标识符表示这个状态,就有了EOF。

应用:档案存取或其它 I/O 功能可能传回等于象征符号值 (巨集) EOF 指示档案结束的情形发生。实际上 EOF 的值通常为 -1,但它依系统有所不同。巨集 EOF会在编译原始码前展开实际值给预处理器。C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。

3.system:

1.system是一个函数,用于运行其它外部程序。函数原型:int system(const char * string);
2.system("cls"),是执行一个CMD中的命令cls,这是清屏命令;
3.system("PAUSE") 是暂停的意思,等待用户信号;不然控制台程序会一闪即过,你来不及看到执行结果;
4.system的背景美化:
首先修改背景字体颜色 :
颜色属性由两十六进制数字指定 -- 第背景第二个则是前景,
每个数字可以为以下任何值之一
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 浅绿色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色

三.我的总结:

通过此次大作业:
1.我终于会把我的输出界面打扮得漂漂亮亮了,学会了用sytem的基本操作,及冻结、清屏、美化;
2.会用“fopen,fclose"读取和关闭文件,还有用“fscanf,fprintf"读取和写入数据;
总之,这次的大作也从完全的小白到自己学习和向别人请教,还有参考了其他同学的代码后完成的,过程不易,不过收获甚多,谢谢所有你们的用心良苦。

posted @ 2019-12-21 14:11    阅读(157)  评论(0编辑  收藏  举报