1.c语言汉字问题
2.文件存储:一次性读入数组处理; 在文件直接处理,保存时先销毁,再重新写。数据丢失。时间问题、内存的问题。
10000条数据,只处理其中一条,编辑一下,再放回去。
fopen(“pathname”,”r|w|r+|w+|a+”);
load();
save():
写入文件:
在操作系统上,创建一个文件,没有指定文件大小,操作系统给分配一个块,4K,结构体
3.getchar()
4.学生身份ID唯一性
5.数据结构struct stu
typedef
6.结构体所占大小计算
7.学生档案信息与成信息分表存放
8.查找
9.编辑/修改
void perror(const char *msg); //#include <stdio.h>
char *strerror(int errnum);//#include <string.h>
学号:分配学号的方案,
Scanf一条信息,查询一下是否有重学号的信息、输入的成绩是否合法
编辑信息
查询信息
删除信息
排序:
Buffer:缓冲区
Size_t: 每个系统的数据类型不一样,同样是int,有的系统用4个字节存储、8位机int
Fflush();
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "stu.h"
#include <windows.h>
#define STUFLNM "student.txt"
void printStu(STU * sp);
void reg_1_stu(FILE *fp);
void show(FILE *fp);
int menu();
void search(char * name,FILE *fp);
void sort(int index,FILE *fp);
int compar(const void *s1,const void * s2);
int index;
int main()
{
char sel;
FILE *fp;
SetConsoleOutputCP(65001); //解决中文乱码问题
fp=fopen(STUFLNM,"a+");
// printf("\33[2J");
while(1) //for(;;)
{
sel=menu();
switch (sel)
{
case '1':
reg_1_stu(fp);
break;
case '2':
show(fp);
break;
case '3':
printf("请输入学生姓名:\n");
char searchName[10];
scanf("%s",&searchName);
//printf("输入的待搜索姓名:%s",searchName);
search(searchName,fp);
break;
case '4':
sort(1,fp);
break;
default:
printf("Bye bye!");
exit(1);
break;
}
}
return 0;
}
/*
* Author:zgp
* CreateTime: 2022-11-05
* Email:zgp@qq.com
* Brief: 打印一条成绩信息
* Param: 学生信息结构体
* Retval: 无
*/
void printStu(STU * sp)
{
printf("id:%d--name:%s--chinese:%s--math:%s--english:%s\n",sp->id,sp->name,(*sp).chinese,(*sp).math,(*sp).English);
}
int insert(FILE *fp,STU * s)
{
int ret;
fseek(fp,0,SEEK_END);
ret=fwrite(s,sizeof(STU),1,fp);
if(ret!=1){
printf("fwrite:%s",strerror(errno));
}
return ret>0?0:1;
}
void reg_1_stu(FILE *fp)
{
STU s,buf;
int dupFlag=0;
printf("Please input stu info [id,name,chinese,math,english]\n");
scanf("%d%s%s%s%s",&s.id,&s.name,&s.chinese,&s.math,&s.English);
printStu(&s);
fseek(fp,0,SEEK_SET);
while(fread(&buf,sizeof(STU),1,fp)==1)
{
if(s.id==buf.id)
{
dupFlag=1;
break;
}
}
if(dupFlag==1)
{
reg_1_stu(fp);
}
if(insert(fp,&s))
{
printf("reg_1_stu:insert error\n");
printf("insert error");
};
}
void show(FILE *fp)
{
int i=0;
STU buf;
fseek(fp,0,SEEK_SET);
while(fread(&buf,sizeof(STU),1,fp)==1)
{
//printStu(&buf);
printf("id:%d--name:%s--chinese:%s--math:%s--english:%s\n",buf.id,buf.name,buf.chinese,buf.math,buf.English);
i++;
}
printf("total student number is %d\n",i);
}
int menu()
{
char sel;
printf("\n\n----------------------------\n\n");
printf("1.reg\n2.show\n3搜索\n4排序\nq.quit");
printf("\n\n----------------------------\n\n");
do{
sel=getchar();
}while(sel==10);
return sel;
}
void search(char * name,FILE *fp)
{
STU s,buf;
fseek(fp,0,SEEK_SET);
size_t nameLen=sizeof(name);
while(fread(&buf,sizeof(STU),1,fp)==1)
{
// printf("buf.name is : %s\n",buf.name);
// printf("input name is : %s\n",name);
if(strstr(buf.name,name)!=NULL)
{
printStu(&buf);
}
}
}
void sort(int index,FILE *fp)
{
STU *stuArr,s1,s2;
int stuArrSize;
int stuNum=0;
stuArr=(STU *)malloc(100*sizeof(STU));
fseek(fp,0,SEEK_SET);
while(fread(stuArr+stuNum,sizeof(STU),1,fp)==1)
{
stuNum++;
stuArrSize=sizeof(stuArr)/sizeof(STU);
if(stuNum>stuArrSize)
{
stuArr=(STU *)realloc(stuArr,sizeof(stuArr)+100*sizeof(STU));
}
}
// switch(index)
// {
// case "1":
// compareFun = compareChinese;
// break;
// case "2":
// compareFun= compareMath;
// break;
// default:
//}
printf("stuNum is %d",stuNum);
qsort(stuArr,stuNum,sizeof(STU),compar);
for(int i=0;i<stuNum;i++)
{
printStu(&stuArr[i]);
}
// switch (index)
// {
// case '3':
// break;
// default:
// break;
// }
}
int compar(const void * s1,const void * s2)
{
STU * sa= (STU*)s1;
STU * sb= (STU*)s2;
if(atof(sa->chinese)-atof(sb->chinese)>0)
{
return 1;
}
else if(atof(sa->chinese)-atof(sb->chinese)==0)
{
return 0;
}
else
{
return -1;
}
}