背景:使用c语言实现,进行从.txt文件来进行增删改查排序读取存储的功能。
1.当使用scanf读取字符时回车也是字符串,会被scanf读取
2.定义整型变量之后,使用scanf为这个变量赋值的时候,不能使用键盘输入字符,如果字符的话,相当于没有接收到任何数据
3.C语言中对文件的读写都是用库函数来实现的。对二进制文件和文本文件都采用缓冲文件系统。----如果没有缓冲的,其实效率非常低。
4.文件的打开与关闭 头文件:stdio.h
fopen函数
用 法:FILE *fopen(char *filename,char *type);
fclose函数
用 法:int fclose(FILE *stream); 返回值:成功返回0,不成功返回EOF(-1)
5.文件的读写
fscanf函数1.fscanf():从文件指针fp指向的文件中,按format中对应的控制格式读取数据,并存储在agars对应的变量中;
原型: fscanf(FILE *fp, const char *format, agars)
fprintf函数 2.fprintf():将agars(参数表)内各项的值,按format(格式控制字符串)所表示的格式,将数据格式为字符串的形式写入到文件指针fp指向的文件中。
注:使用标准化输入/出 时 ,一定要格式匹配
6.一个汉字占两个字节
7.标准的C和C++都不支持正则表达式,但有正则表达式的函数库提供这功能.
8.C语言中并没有bool类型变量。这是C++中新增的系统类型,要在C语言中使用bool类型,可以使用自定义的方式。
1 使用整型做bool类型。typedef int bool;
2 使用枚举类型做bool类型。typedef enum{ false, true}bool;
9.格式化代码快捷键:ctrl+K+F
10.排序简单的使用冒泡排序法,其实对学号对姓名排序都是一样的
11.整个界面的循环使用do while(1),有符合条件的输入使用break跳出;相比switch case,其实if语句更方便
12.对文本的修改删除相对比较麻烦,比如说删除的方法就是:将文件写入到另一个文件中,当遇到不需要的内容时不写入,然后最后 再重新覆盖掉原文件。
13.一些报错的点
error C2143: 语法错误 : 缺少“;”(在“类型”的前面)
其实是因为纯c环境下,局部变量必须在函数的头部进行声明和定义,而不能是函数体中,而c++中就不会如此限制了。一般c文件的后缀是.c,而c++文件的后缀是.c++
link error 就是连接错误,一般都是因为还有项目在跑着
14.一些相对比较关键的代码点
int counts = 0;//学生数量的统计
//1:初始化菜单 就是将各个功能函数模块化
void initMenu();
//2:查询显示学生信息界面
void selectMenu();
//3:初始化学生信息---从文件中读取学生信息并初始化
void initData();
//4:显示学生信息
void display();
//3.初始化学生信息
void initData()
{
FILE *fp;
fp = fopen("E://student.txt", "r");
if (fp == NULL){
printf("文件打开错误\n");
exit(0);
}
else{//读取文件中的信息到学生数组中
while (!feof(fp) && fscanf(fp, "%s %s %s %d %d %s", stu[counts].id,stu[counts].name, stu[counts].sex, &stu[counts].age,&stu[counts].grade, stu[counts].major) != -1){
counts++;
}//while
//printf("%d", counts);
}//else
fclose(fp);
}
int i;//判断值的使用
printf("\n请输入要插入的学生信息的学号(4位):");
scanf("%s", stu[counts].id);
len = strlen(stu[counts].id);
if (len == 4){
for (i = 0; i < counts; i++){
if (strcmp(stu[counts].id, stu[i].id) == 0){
printf("该学生已存在!请重新输入\n");
break;
}
else continue;
}
if (i == counts)break;//说明没有匹配项,则可以进行添加 另一种可行的方法是按序排放,那么只需要和前一个人的学号比较即可
//13.按照性别将学生信息进行存储
void save()
{
FILE *fpf,*fpm;
fpf = fopen("E://female.txt", "w");
fpm = fopen("E://male.txt", "w");
if (fpf == NULL&&fpm==NULL){
printf("创建文件失败\n");
exit(0);
}
for (int i = 0; i < counts; i++){
if (strcmp(stu[i].sex, "男") == 0){//将该数组存储到对应的文件中
fprintf(fpm, "%s\t\t%s\t%s\t%d\t%d\t%s\n", stu[i].id, stu[i].name, stu[i].sex, &stu[i].age, &stu[i].grade, stu[i].major);
}
else{
fprintf(fpf, "%s\t\t%s\t%s\t%d\t%d\t%s\n", stu[i].id, stu[i].name, stu[i].sex, &stu[i].age, &stu[i].grade, stu[i].major);
}
}
fclose(fpf);
fclose(fpm);
printf("存储成功!");
}