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;
    }
  
}