文件
一.任务代码:
#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"读取和写入数据;
总之,这次的大作也从完全的小白到自己学习和向别人请教,还有参考了其他同学的代码后完成的,过程不易,不过收获甚多,谢谢所有你们的用心良苦。