精华内容
下载资源
问答
  • win下c语言实现文件管理系统
    千次阅读
    2021-05-23 08:57:53

    最近学到操作系统的文件管理,研究了一下文件查询,代码如下

    1.完整版(老师给出的示例代码)

    #include "windows.h"

    #include "stdio.h"

    int num=0;

    void find(char *path,char *name)

    {

    char szFind[MAX_PATH],szFile[MAX_PATH];

    WIN32_FIND_DATA fd;

    sprintf(szFind,"%s\\%s",path,name);

    HANDLE hFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE!=hFind)

    {

    while(1)

    {

    printf("\n%s\\%s\n",path,fd.cFileName);

    num++;

    if(!FindNextFile(hFind,&fd))break;

    }

    FindClose(hFind);

    }

    sprintf(szFind,"%s\\*.*",path);

    hFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE==hFind)return;

    while(TRUE)

    {

    if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)

    {

    if(fd.cFileName[0]!='.')

    {

    sprintf(szFile,"%s\\%s",path,fd.cFileName);

    find(szFile,name);

    }

    }

    if(!FindNextFile(hFind,&fd))break;

    }

    FindClose(hFind);

    }

    int main()

    {

    DWORD dwSize = MAX_PATH;

    char szLogicalDrives[MAX_PATH] = {0};

    char name[]="pra*.*";

    //获取逻辑驱动器号字符串

    DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);

    //处理获取到的结果

    if (dwResult > 0 && dwResult <= MAX_PATH) {

    char* szSingleDrive = szLogicalDrives; //从缓冲区起始地址开始

    while(*szSingleDrive)

    {

    printf("Drive: %s ", szSingleDrive); //输出单个驱动器的驱动器号

    switch(GetDriveType(szSingleDrive))

    {

    case DRIVE_UNKNOWN : puts("未知的磁盘类型"); break;

    case DRIVE_NO_ROOT_DIR: puts("路径无效"); break;

    case DRIVE_REMOVABLE : puts("可移动磁盘"); break;

    case DRIVE_FIXED : puts("固定磁盘");

    find(szSingleDrive,name);

    break;

    case DRIVE_REMOTE : puts("网络磁盘"); break;

    case DRIVE_CDROM : puts("光驱"); break;

    case DRIVE_RAMDISK : puts("内存映射盘"); break;

    default:break;

    }

    // 获取下一个驱动器号起始地址

    szSingleDrive += strlen(szSingleDrive) + 1;

    }

    }

    return 0;

    }

    2.分析

    ///获取盘符

    DWORD dwSize = MAX_PATH;

    char szLogicalDrives[MAX_PATH] = {0};//获取逻辑驱动器号字符串

    DWORD dwResult =GetLogicalDriveStrings(dwSize,szLogicalDrives);

    char* szSingleDrive =szLogicalDrives;  //从缓冲区起始地址开始

    while(* szSingleDrive){

    printf("Drive: %s     ", szSingleDrive);

    szSingleDrive += strlen(szSingleDrive)+ 1;}

    ///获取当前目录下目标文件

    char szFind[MAX_PATH];

    WIN32_FIND_DATA fd;

    sprintf(szFind,"%s\\%s",path,name);

    HANDLEhFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE!=hFind)

    {

    while(1)

    {

    printf("\n%s\\%s\n",path,fd.cFileName);

    num++;

    if(!FindNextFile(hFind,&fd))break;

    }

    FindClose(hFind);

    }

    ///获取目录

    sprintf(szFind,"%s\\*.*",path);

    hFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE==hFind)return0;

    while(TRUE)

    {

    if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)

    {

    if(fd.cFileName[0]!='.')

    {

    sprintf(szFile,"%s\\%s",path,fd.cFileName);

    find(szFile,name);//递归调用

    }

    }

    if(!FindNextFile(hFind,&fd))break;

    }

    FindClose(hFind);

    3.知识点:

    盘符的类型很多,可以用GetDriveType(当前盘符)【GetDriveType(szSingleDrive)】获取

    获取下一个盘符:szSingleDrive += strlen(szSingleDrive) + 1;

    文件: FindFirstFile(szFind,&fd)与FindNextFile(hFind,&fd),可以用或者判定前者是否结束

    WIN32_FIND_DATA,该结构的内容如下:

    typedef struct _WIN32_FIND_DATA {                         DWORD dwFileAttributes; //文件属性

    FILETIME ftCreationTime; // 文件创建时间

    FILETIME ftLastAccessTime; // 文件最后一次访问时间

    FILETIME ftLastWriteTime; // 文件最后一次修改时间

    DWORD nFileSizeHigh; // 文件长度高32位

    DWORD nFileSizeLow; // 文件长度低32位

    DWORD dwReserved0; //统保留

    DWORD dwReserved1; // 系系统保留

    TCHAR cFileName[ MAX_PATH ]; // 长文件名

    TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名

    } WIN32_FIND_DATA, *PWIN32_FIND_DATA;

    #define FILE_ATTRIBUTE_DIRECTORY  0x00000010  文件夹 第5位                       判断是文件还是目录

    fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY   &:相同为1,不同为0

    if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)运算为1就是文件夹,0为文件

    if(fd.cFileName[0]!='.')  .表示当前路径,..表示后退一布路径

    4.简单文件查询(根据windows自带的文件查询命令简化)

    #include #include #include int main()

    {

    DWORD dwDriveStrLen;

    char wDrivesName[ 0x100 ];

    dwDriveStrLen = sizeof( wDrivesName );

    GetLogicalDriveStrings(dwDriveStrLen, wDrivesName);

    char *p = ( char * )wDrivesName;//得到所有盘符

    char str[1000],name[100];

    scanf("%s",name);

    while( *p )

    {

    sprintf(str,"for /r %s %%i in (%s) do @echo %%i",p,name);

    p += ( strlen( p ) + 1 );

    system(str);//执行查询命令

    }

    return 0;

    }

    更多相关内容
  • 实现功能: 1)图书管理员 (1)录入:增加一本图书信息;√ (2)删除:删除某一本图书的信息;√ (3)修改:修改某一本图书的信息;√ (4)查询:根据书名或图书ISBN等查询图书信息(可选择:简单条件查询,...
  • 大一下学期工程实践课程的作业内容,系统完全由c语言编写,采用dev-c++开发,数据类型为结构体数组,用户信息和图书信息保存在本地文本文件中,主要功能有:1、以管理员或读者不同身份注册账户。2、登录、找回密码、...
  • 运用链表实现需求,学生通讯录基本信息主要包括:学号、姓名、性别、所属院系、专业、通讯地址、电话、QQ号、Email等,系统应能对这些基本信息进行管理。要求具有但不限于以下功能: 添加新学生信息、删除和修改...
  • 1.纯c语言实现 2.可在devc++上运行 3.含有读写文件的操作。 4.基于链表实现。 5.增删改查,排序,等功能齐全 6.bug较少(可能会有)
  • C语言版教师信息管理系统(可以添加、查询教师基本信息,包括职工号,教师,姓名,出生年月等等,如有需要可以仿照自行添加),不涉及数据库,只是创建txt文件并且简单存储到txt文件中,内附txt详细代码,以及pdf版...
  • C语言课程设计期末大作业校医院管理系统源码+报告,纯手打高分项目 本系统采用C语言编写,分为用户端和医生端,主要实现预约和查找功能。其中数据存储采用数据流的方式存储为文本文档,读取时采用链表来方便增删...
  • (源码加报告)功能需求  设计具有缩进的目录文件格式输出 ... 设计算法实现cp命令,其功能是复制制定文件或目录到指定的另外一个目录。  设计算法,实现mv命令,其功能是堆指定目录进行重命名
  • 本程序是实验设备管理系统,用于对实验设备数据的管理。其功能包括: 添加设备信息,对设备信息的遍历,按设备种类查询,按报废状态统计数量,按报废状态删除报废设备记录,追加设备记录,求全部设备的价值,从文件...
  • 自己花了点时间琢磨了一个简易版的链表,里面很多地方还是比较复杂的,希望大佬能指导修改一下,同时也供初学数据结构的码友参考学习
  • 利用WIN-TC实现学生成绩管理系统的录入、查询、删除、统计等基本操作,使用单链表结构实现学生成绩管理,了解数据库管理的基本功能,掌握C语言中的结构体、指针、函数(系统函数、自定义函数)、文件操作等知识。...
  • 本程序为大学c语言实践课程综合程序,学生成绩管理系统章节的作业代码,涉及二几十个函数和文件操作等。自己写的,有增加一些功能,让程序更为完整,代码部分应该有能改进的空间,希望能帮到大家
  • 基于C语言的图书管理系统程序设计.pdf
  • 题目 学生健康情况管理系统 【问题描述】 实现学生健康情况管理的几个操作功能(新建、插入、删除、从文件读取、写入文件和查询、屏幕输出等功能)。健康表中学生的信息有学号、姓名、出生日期、性别、身体状况等。...
  • 学员管理系统C语言版工程项目)有意把简单项目复杂化,项目有9个子文件夹,每个文件夹有一个“.c”".h"文件实现特定功能,通过主函数调用各个部分,属于模块化编程,有利于c语言新手初步建立工程项目的概念...
  • 管理系统java sal源码 C-language 注意:c语言严重错误代码 //int nums[5] = {1,2,3,5,6}; //int* pNum = (int*)realloc(nums, 10);不能将一个静态数组的内存空间进行扩容!!! //int* p;//*p=5;这个是错误的必须...
  • 操作系统:Windows运行。如果需要在Linux运行,则需要修改删除conio.h,自己写个头文件获取键盘输入。我已经写好了getch.h文件,需要将其导入使用。 开发环境:CodeBlocks 开发语言:C 实现功能:登录,订票,...

    前言

    操作系统:Windows下运行。如果需要在Linux运行(单机版),则需要修改删除conio.h,自己写个头文件获取键盘输入。我已经写好了getch.h文件,需要将其导入使用。

    开发环境:CodeBlocks || VS Code ( gcc编译 )

    开发语言:C

    实现功能:登录,订票,退票

    数据存储:文本读写

    涉及文件:

    文件构建可以参考:码云:传送门  GitHub:传送门

    这几个信息文件不能少!!! 少了程序跑不了!!!

    相关文件下载:

    *******************************************

    *                                                          *

    *   码云传送门  GitHub传送门     *

    *                                                          *

    *******************************************

    相关图片(仅供参考):程序是没有涉及旅行社的

    ps:图片由PowerDesigner绘制而成

    ER图:

    数据库:

    类图:

    用例图:

    订票顺序图:

    订票状态图:

    登录活动图:

    以上图片仅供参考,请自行斟酌

    程序主界面:

     进入子功能需要账号和密码,存储在passenger.txt文件中

    ps:文件数据的顺序就是结构体的顺序

    typedef struct Flight
    {
        char fid[20];       //航班号
    	char fname[20];	    //航班名称
        char start[10];     //起点
        char end[10];       //终点
        int fnum;	        //票数
    }Flight;
    
    typedef struct Passenger
    {
        char pid[20];	    //身份证
        char pname[10];	    //姓名
        char password[20];	//密码
    	char tell[20];	    //电话
    }Passenger;
    
    typedef struct Order
    {
        char pid[20];	//身份证
        char fid[20];	//航班号
    	int num;	    //票数
    }Order;

    单机版(win)

    注意头文件使用的conio.h,此版本为windows,linux参考前言的代码仓库

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>
    //#include "getch.h"
    #include <conio.h>
    
    #define MAX_Flight 50   // 最大航班数
    #define MAX_Passenger 20    // 单航班最多乘客数
    #define MAX_Order 50    // 最大订票数
    
    typedef struct Flight
    {
        char fid[20];       //航班号
    	char fname[20];	    //航班名称
        char start[10];     //起点
        char end[10];       //终点
        int fnum;	        //票数
    }Flight;
    
    typedef struct Passenger
    {
        char pid[20];	    //身份证
        char pname[10];	    //姓名
        char password[20];	//密码
    	char tell[20];	    //电话
    }Passenger;
    
    typedef struct Order
    {
        char pid[20];	//身份证
        char fid[20];	//航班号
    	int num;	    //票数
    }Order;
    
    Flight *FLI;    // 定义全局变量
    Passenger *PAS;
    Order *ORD;
    
    char start[10]; //起点
    char end[10];   //终点
    char search_fid[50][20];    //符合条件的航班号
    int search_fnum[50];        //符合条件的航班票数
    int online = 0;             //是否登录的变量
    char online_pid[20];        //在线用户的身份证
    int search_num = 0;         //符合条件的航班数
    
    void init_sys(void);	    // 系统初始化
    void show_flight(void);	    // 显示航班表
    void start_sys(void);	    // 系统开始运行
    void exit_sys(void);	    // 退出系统
    void menu(void);		    // 生成主菜单
    void login(void);           // 登录
    void logout(void);          //用户登出
    void passenger_info(void);  //查询旅客信息
    bool change_pas_info(void); //修改旅客信息
    void search_start(void);	// 生成查询页面
    bool search(void);	        // 查询航班
    void order_list(void);	    // 生成订单表
    void del_order(void);	    // 退票
    void clear_stdin(void);	    // 清除输入缓冲区
    char* get_str(char* str,size_t len);  // 获取字符串
    char get_cmd(char start,char end);	  // 获取cmd命令
    
    // 主函数
    int main()
    {
    	init_sys();     // 系统初始化
    	start_sys();    // 系统开始运行
    	exit_sys();     // 系统结束
    	return 0;
    }
    
    // 系统初始化
    void init_sys(void)
    {
    	// 申请堆内存、加载数据
    	FLI = calloc(MAX_Flight,sizeof(Flight));
    	PAS = calloc(MAX_Passenger,sizeof(Passenger));
    	ORD = calloc(MAX_Order,sizeof(Order));
    	printf("system_init...\n");
    
        // 以只读方式打开 order.txt,如果文件不存在则打开失败,返回值为空。
    	FILE* ofrp = fopen("order.txt","r");
        if(NULL == ofrp)    // 打开失败直接退出
        {
            printf("order.txt open failed!\n");
            exit(0);
        }
    
        int i = 0;
    	for(i = 0; i < MAX_Order; i++)	//读取文本中的数据到内存,全局变量ORD中
    	{	
            int num = 0;
    		num = fscanf(ofrp,"%s %s %d\n", ORD[i].pid, ORD[i].fid, &ORD[i].num);
    	}
    
    	FILE* ffrp = fopen("flight.txt","r");
        if(NULL == ffrp)
        {
            printf("flight.txt open failed!\n");
            exit(0);
        }
    	for(i = 0; i < MAX_Flight; i++)
    	{
    		int num = 0;
    		num = fscanf(ffrp,"%s %s %s %s %d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, &FLI[i].fnum);
    	}
    
    	FILE* pfrp = fopen("passenger.txt","r");
        if(NULL == pfrp)
        {
            printf("passenger.txt open failed!\n");
            exit(0);
        }
    	for(i = 0; i < MAX_Passenger; i++)
    	{
    		int num = 0;
    		num = fscanf(pfrp,"%s %s %s %s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
    	}
    }
    
    // 显示航班表
    void show_flight(void)
    {
        int i = 0;
    	for(i = 0; i < MAX_Flight; i++)
    	{
    		if(strlen(FLI[i].fid) != 0)
    		{
    			printf("id:%s name:%s start:%s end:%s fnum:%d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, 
                    FLI[i].fnum);
    		}
    	}
    }
    
    // 系统开始运行
    void start_sys(void)
    {
    	// 进入系统的业务流程控制
    	//printf("系统开始运行...\n");
    	//show_flight();
    	while(true)
    	{
    		menu();
    		switch(get_cmd('0','7')) // 获取键盘输入
    		{
    			case '1': search_start(); break;
    			case '2': order_list(); break;
    			case '3': del_order(); break;
    			case '4': passenger_info(); break;
    			case '5': change_pas_info(); break;
    			case '6': login(); break;
    			case '7': logout(); break;
    			case '0': return;
    		}
    	}
    }
    
    // 系统结束
    void exit_sys(void)
    {
        printf("data insert...\n");
    	FILE* ofwp = fopen("order.txt","w");
    	printf("ready insert order.txt\n");
    	int i= 0;
    	for(i = 0; i < MAX_Order; i++)	//数据存储回本地
    	{
    	    int num = 0;
    		if(strlen(ORD[i].pid) != 0)
    		{
    			num = fprintf(ofwp,"%s %s %d\n", ORD[i].pid, ORD[i].fid, ORD[i].num);
    			//printf("insert order.txt success\n");
    		}
    	}
    
        // 以只写方式打开文件flight.txt,如果文件不存在则创建,如果文件存在则把内容清空。
    	FILE* ffwp = fopen("flight.txt","w");
    	printf("insert flight.txt\n");
    	for(i = 0; i < MAX_Flight; i++)
    	{
    		int num = 0;
    		if(strlen(FLI[i].fid) != 0)
    		{
    			num = fprintf(ffwp,"%s %s %s %s %d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, FLI[i].fnum);
    			//printf("insert flight.txt success\n");
    		}
    	}
    
    	FILE* pfwp = fopen("passenger.txt","w");
    	printf("insert passenger.txt\n");
    	for(i = 0; i < MAX_Passenger; i++)
    	{
    		int num = 0;
    		if(strlen(PAS[i].pid) != 0)
    		{
    			num = fprintf(pfwp,"%s %s %s %s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
    			//printf("insert passenger.txt success\n");
    		}
    	}
    	// 释放内存、保存数据
    	free(FLI);
    	free(PAS);
    	free(ORD);
    	printf("exit...\n");
    }
    
    // 生成主菜单
    void menu(void)
    {
        printf("\n");
        printf("********************************\n");
        printf("|                              |\n");
    	printf("|      flight order system     |\n");
    	printf("*      1.search_flight         *\n");  //查询航班
    	printf("|      2.order_list            |\n");   //查询订票信息
    	printf("*      3.del_order             *\n");    //退订
    	printf("|      4.passenger_info        |\n");   //查询旅客信息
    	printf("*      5.change_pas_info       *\n");  //修改旅客信息
    	printf("|      6.login                 |\n");  //用户登录
    	printf("*      7.logout                *\n");    //用户登出
    	printf("|      0.exit_sys              |\n");   //退出系统
    	printf("|                              |\n");
    	printf("********************************\n");
    	//printf("\n");
    }
    
    // 登录
    void login(void)
    {
        if(online == 0)	//如果没有登录
        {
            int i=0;
            int time = 0;
            while(time < 3)
            {
                char entry_pid[20]; //临时变量身份证
                char entry_pw[20];  //临时变量密码
                printf("please login!\n");
                printf("please entry pid:");
                get_str(entry_pid, 20);
                printf("please entry password:");
                get_str(entry_pw, 20);
                // 遍历所有乘客
                for(i = 0; i < MAX_Passenger; i++)
                {
                    // 数据长度校验
                    if(strlen(entry_pid) == 0 || strlen(entry_pw) == 0)
                    {
                        printf("pid or password can't be empty\n");
                        time++;
                        break;
                    }
                    // 成功匹配账号密码
                    else if(strcmp(PAS[i].pid, entry_pid) == 0 && strcmp(PAS[i].password, entry_pw) == 0)
                    {
                        printf("login success!\n");
                        strncpy(online_pid, entry_pid, 20);
                        online = 1;
                        return;
                    }
                    else if(i == MAX_Passenger-1)
                    {
                        printf("pid or password error\n");
                        time++;
                    }
                }
            }
            online = -1;
            printf("you have been locked,you can use this system now\n");
        }
        else if(online ==1)
        {
            printf("you have been login\n");
        }
        else
        {
            printf("you have been locked,you can use this system now\n");
        }
    
    }
    
    // 用户登出
    void logout(void)
    {
        if(online == 1)	//如果已经登录
        {
            online = 0;
            printf("logout success\n");
        }
        else if(online == -1)
        {
            printf("you have been locked,you can use this system now\n");
        }
        else
        {
            printf("you have not login\n");
        }
    }
    
    // 查询旅客信息
    void passenger_info(void)
    {
        if(online == 1)	//如果已经登录
        {
            //printf("online_pid:");
            //puts(online_pid);
            int i = 0;
            for(i = 0; i < MAX_Passenger; i++)
            {
                if(strcmp(online_pid, PAS[i].pid) == 0)
                {
                    printf("pid:%s, pname:%s, password:%s, tell:%s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
                    break;
                }
            }
        }
        else if(online == -1)
        {
            printf("you have been locked,you can use this system now\n");
        }
        else
        {
            printf("you have not login\n");
        }
    }
    
    //修改旅客信息
    bool change_pas_info(void)
    {
        if(online == 1)	//如果已经登录
        {
            printf("your old info:\n");
            int i = 0;
            for(i = 0; i < MAX_Passenger; i++)
            {
                if(strcmp(online_pid, PAS[i].pid) == 0)
                {
                    printf("pid:%s, pname:%s\npassword:%s, tell:%s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
                    break;
                }
            }
            char new_pid[20] = {0};
            char new_pname[10] = {0};
            char new_password[20] = {0};
            char new_tell[20] = {0};
            printf("please entry new pid:");
            get_str(new_pid, 20);
            printf("please entry new pname:");
            get_str(new_pname, 10);
            printf("please entry new password:");
            get_str(new_password, 20);
            printf("please entry new tell:");
            get_str(new_tell, 20);
            strncpy(PAS[i].pid, new_pid, 20);
            strncpy(PAS[i].pname, new_pname, 20);
            strncpy(PAS[i].password, new_password, 20);
            strncpy(PAS[i].tell, new_tell, 20);
            printf("change success\n");
        }
        else if(online == -1)
        {
            printf("you have been locked,you can use this system now\n");
        }
        else
        {
            printf("you have not login\n");
        }
    }
    
    // 开始查询航班
    void search_start(void)
    {
    	if(search())
    	{
    		printf("1.order\n");
    		printf("0.back\n");
    		char cmd = get_cmd('0', '1');
    		if(cmd == '0')
    		{
    		    return;
    			//start_sys();
    		}
    		else
    		{
    		    char fid[20];   // 选择的航班号
                if(online == 1) // 如果已经登录
                {
                    printf("please entry fid:");
                    get_str(fid, 20);
    				if(0 == strlen(fid))
    				{
    					printf("fid is empty\n");
    				}
                    int i = 0;
                    for(i = 0; i < search_num; i++)
                    {
                        //printf("fid:%s s_fid:%s num:%d\n",fid,search_fid[i],search_fnum[i]);
                        if(strcmp(fid,search_fid[i]) == 0 && search_fnum[i] > 0)    //查询到对应航班
                        {
                            printf("order success\n");
                            int j = 0;
                            for(j = 0; j < MAX_Flight; j++) // 遍历航班表
                            {
                                if(strcmp(fid, FLI[j].fid) == 0)
                                {
                                    FLI[j].fnum--;	//票数减1
                                    break;
                                }
                            }
    
                            int k = 0;
                            for(k = 0; k < MAX_Order; k++)  // 遍历订票表
                            {
                                //printf("ready insert...\n");
                                if(strlen(ORD[k].pid) == 0) // 在空位置插入数据
                                {
                                    strcpy(ORD[k].pid, online_pid);  // 插入当前用户身份证
                                    strcpy(ORD[k].fid, search_fid[i]);   // 插入当前选择的航班号
                                    ORD[k].num = 1;
                                    printf("insert_to_order success\n");
                                    break;
                                }
                            }
                            return;
                        }
                        else if(strcmp(fid,search_fid[i]) == 0 && search_fnum[i] == 0)
                        {
                            printf("no ticket\n");
                            search_start();
                        }
                        else if(i == MAX_Flight-1)
                        {
                            printf("don't have this fid\n");
                            search_start();
                        }
                    }
                }
                else if(online == -1)
                {
                    printf("you have been locked,you can use this system now\n");
                }
                else
                {
                    login();
                }
    		}
    	}
    }
    
    // 查询航班
    bool search(void)
    {
        printf("start: \n");
    	get_str(start,10);
    	printf("end: \n");
    	get_str(end,10);
    	int i = 0;
    	search_num = 0;
        // 遍历所有航班
    	for(i = 0; i < MAX_Flight; i++)
    	{
    	    if(strlen(start) == 0 || strlen(end) == 0)
    		{
    			printf("start or end can't be empty\n");
    			return false;
    		}
    		if(strcmp(FLI[i].start, start) == 0 && strcmp(FLI[i].end, end) == 0)
    		{
    			printf("fid:%s, ticket_num:%d\n", FLI[i].fid, FLI[i].fnum);
    			strncpy(search_fid[search_num], FLI[i].fid, 20);
    			search_fnum[search_num] = FLI[i].fnum;
    			//printf("search_fid[%d]:%s, search_fun[%d]:%d\n",search_num,search_fid[search_num],search_num,search_fnum[search_num]);
    			++search_num;
    		}
    		if(0 == search_num && i == MAX_Flight-1)
    		{
    			printf("no flight\n");
    			return false;
    		}
    		if(search_num > 0 && i == MAX_Flight-1)
    		{
    			//show_flight();
    			return true;
    		}
    	}
    }
    
    // 输出订单信息
    void order_list(void)
    {
        if(online == 1)
        {
            int i = 0;
            for(i = 0; i < MAX_Order; i++)
            {
                if(strcmp(online_pid, ORD[i].pid) == 0)
                {
                    //printf("online_pid:%s\n",online_pid);
                    printf("fid:%s, pid:%s, ticket:%d\n", ORD[i].fid, ORD[i].pid, ORD[i].num);
                }
            }
        }
        else if(online == -1)
        {
            printf("you have been locked,you can use this system now\n");
        }
        else
        {
            login();
        }
    }
    
    // 删除订单
    void del_order(void)
    {
        if(online == 1)
        {
            char fid[20];
            printf("order_list:\n");
            order_list();
            printf("please entry del_order fid:");
            get_str(fid, 20);
            int i = 0;
            // 遍历所有订单
            for(i = 0; i < MAX_Order; i++)
            {
                if(strlen(fid) == 0)  //判空
                {
                    printf("del_order fid can't be empty\n");
                    return;
                }
                if(strcmp(fid, ORD[i].fid) == 0)
                {
                    memset(ORD[i].pid, '\0', sizeof(ORD[i].pid));
                    int j = 0;
                    for(j = 0; j < MAX_Flight; j++)
                    {
                        if(strcmp(fid, FLI[j].fid) == 0)
                        {
                            FLI[j].fnum++;  // 返还飞机票
                            break;
                        }
                    }
                    printf("delete success\n");
                    return;
                }
            }
        }
        else if(online == -1)
        {
            printf("you have been locked,you can use this system now\n");
        }
        else
        {
            login();
        }
    
    }
    
    // 清理输入缓冲区
    /*void clear_stdin(void)
    {
    	stdin->_IO_read_ptr = stdin->_IO_read_end;//清理输入缓冲区
    }
    */
    
    // 读取输入字符串
    char* get_str(char* str, size_t len)
    {
    	if(NULL == str)
    	{
    		puts("empty ptr!");
    		return NULL;
    	}
    
    	char *in = fgets(str, len, stdin);
    
    	size_t cnt = strlen(str);
    	if('\n' == str[cnt-1])
    	{
    		str[cnt-1] = '\0';
    	}
    	else
    	{
    		scanf("%*[^\n]");
    		scanf("%*c");
    	}
    	
    	//clear_stdin();
    
    	return str;
    }
    
    // 获取cmd命令
    char get_cmd(char start, char end)
    {
    	//clear_stdin();
    
    	printf("please entry cmd:");
    	while(true)
    	{
    		char val = getch();
    		if(val >= start && val <= end)
    		{
    			printf("%c\n",val);
    			return val;
    		}
    	}
    }
    

    TCP联网版(win)

    先运行服务端,再运行客户端

    因为懒,阉割了联网版的旅客信息修改功能。

    编译参考 

    gcc server.c -lwsock32 -o server

    效果如下:

    client.c

    同理这里也是Windows版本,使用winsock实现tcp

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>
    //#include "getch.h"
    #include <conio.h>
    #include <WinSock2.h>
    
    #pragma comment(lib,"ws2_32.lib")
    
    void start_sys(void);       // 系统开始运行
    char *send_cmd_recv_val(char* cmd); // 发送命令,接收返回
    void show_flight(void);	    // 显示航班表
    void exit_sys(void);	    // 退出系统
    void menu(void);		    // 生成主菜单
    void login(void);           // 登录
    void logout(void);          // 用户登出
    void passenger_info(void);  // 查询旅客信息
    void search_start(void);	// 生成查询页面
    char* search(void);	        // 查询航班
    void order_list(void);	    // 生成订单表
    void del_order(void);	    // 退票
    char* get_str(char* str,size_t len);  // 获取字符串
    char get_cmd(char start,char end);	  // 获取cmd命令
    
    int main(int argv, char* argc[])
    {
        system("chcp 65001");
        printf("编码转换完毕\n");
    
        start_sys();
        exit_sys();
    
    	return 0;
    }
    
    // 发送命令,接收返回
    char *send_cmd_recv_val(char* cmd)
    {
        //初始化
    	WSADATA wsaData;
    	WSAStartup(MAKEWORD(2, 2), &wsaData);
    
    	//创建套接字
    	SOCKET clntSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    
    	//向服务器发送消息
    	struct sockaddr_in sockAddr;
    	memset(&sockAddr, 0, sizeof(sockAddr));			//每个字节都用0填充
    	sockAddr.sin_family = PF_INET;
    	sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	sockAddr.sin_port = htons(8888);
    	connect(clntSock, (SOCKADDR*)& sockAddr, sizeof(SOCKADDR));
    	
        static char buf[10240] = {0};
    
        // buf置0
        memset(buf, 0, sizeof(buf));
    
        send(clntSock, cmd, strlen(cmd) + sizeof(char), 0);
        recv(clntSock, buf, 10240, 0);
    	
    	//关闭套接字
    	closesocket(clntSock);
    
    	//终止dll
    	WSACleanup();
    
        return buf;
    }
    
    // 显示航班表
    void show_flight(void)
    {
        printf("%s\n", send_cmd_recv_val("show_flight"));
    }
     
    // 系统开始运行
    void start_sys(void)
    {
    	// 进入系统的业务流程控制
    	//printf("系统开始运行...\n");
    	//show_flight();
    	while(true)
    	{
    		menu();
    		switch(get_cmd('0','6')) // 获取键盘输入
    		{
    			case '1': search_start(); break;
    			case '2': order_list(); break;
    			case '3': del_order(); break;
    			case '4': passenger_info(); break;
    			case '5': login(); break;
    			case '6': logout(); break;
    			case '0': return;
    		}
    	}
    }
     
    // 系统结束
    void exit_sys(void)
    {
        printf("%s\n", send_cmd_recv_val("exit_sys"));
    }
     
    // 生成主菜单
    void menu(void)
    {
        printf("\n");
        printf("*********************************\n");
        printf("|                               |\n");
    	printf("|      飞机订票系统             |\n");
    	printf("*      1.查询航班               *\n");  //查询航班
    	printf("|      2.查询订票信息           |\n");   //查询订票信息
    	printf("*      3.退订                   *\n");    //退订
    	printf("|      4.查询旅客信息           |\n");   //查询旅客信息
    	printf("|      5.用户登录               |\n");  //用户登录
    	printf("*      6.用户登出               *\n");    //用户登出
    	printf("|      0.退出系统               |\n");   //退出系统
    	printf("|                               |\n");
    	printf("*********************************\n");
    	//printf("\n");
    }
     
    // 登录
    void login(void)
    {
        char entry_pid[20]; //临时变量身份证
        char entry_pw[20];  //临时变量密码
        printf("请登录!\n");
        printf("请输入pid:");
        get_str(entry_pid, 20);
        printf("请输入密码:");
        get_str(entry_pw, 20);
    
        char buf[1024] = {0};
    
        snprintf(buf, 1024, "login pid:%s pw:%s", entry_pid, entry_pw);
        
        printf("%s\n", send_cmd_recv_val(buf));
    }
     
    // 用户登出
    void logout(void)
    {
        printf("%s\n", send_cmd_recv_val("logout"));
    }
     
    // 查询旅客信息
    void passenger_info(void)
    {
        printf("%s\n", send_cmd_recv_val("passenger_info"));
    }
     
    // 开始查询航班
    void search_start(void)
    {
        char buf[10240] = {0};
        snprintf(buf, 10240, "%s", search());
    	if(strncmp(buf, "起始地 或 目的地 不能为空\n", 50) != 0 && strncmp(buf, "没有航班\n", 50) != 0)
    	{
    		printf("1.订票\n");
    		printf("0.返回\n");
    		char cmd = get_cmd('0', '1');
    
            memset(buf, 0, sizeof(buf));
    
    		if(cmd == '0')
    		{
                snprintf(buf, 10240, "%s", send_cmd_recv_val("0.返回"));
                printf("%s", buf);
                return;
    			//start_sys();
    		}
    		else
    		{
                snprintf(buf, 10240, "%s", send_cmd_recv_val("1.订票"));
    		    char fid[20];   // 选择的航班号
                printf("请输入fid:");
                get_str(fid, 20);
    
                snprintf(buf, 1024, "order_ticket fid:%s", fid);
                
                printf("%s\n", send_cmd_recv_val(buf));
    		}
    	}
    }
     
    // 查询航班
    char* search(void)
    {
        char start[10] = {0};
        char end[10] = {0};
        printf("起始地: \n");
    	get_str(start, 10);
    	printf("目的地: \n");
    	get_str(end, 10);
    	
        char buf[1024] = {0};
        static char buf2[10240] = {0};
        memset(buf2, 0, sizeof(buf2));
    
        snprintf(buf, 1024, "search start:%s end:%s", start, end);
        
        snprintf(buf2, 10240, "%s", send_cmd_recv_val(buf));
    
        printf("%s", buf2);
        
        return buf2;
    }
     
    // 输出订单信息
    void order_list(void)
    {
        printf("%s\n", send_cmd_recv_val("order_list"));
    }
     
    // 删除订单
    void del_order(void)
    {
        printf("%s\n", send_cmd_recv_val("order_list"));
        char fid[20];
        printf("请输入要删除的fid:");
        get_str(fid, 20);
    
        char buf[1024] = {0};
        snprintf(buf, 1024, "del_order fid:%s", fid);
        
        printf("%s\n", send_cmd_recv_val(buf));
    }
     
    // 读取输入字符串
    char* get_str(char* str, size_t len)
    {
    	if(NULL == str)
    	{
    		puts("空指针!");
    		return NULL;
    	}
     
    	char *in = fgets(str, len, stdin);
     
    	size_t cnt = strlen(str);
    	if('\n' == str[cnt-1])
    	{
    		str[cnt-1] = '\0';
    	}
    	else
    	{
    		scanf("%*[^\n]");
    		scanf("%*c");
    	}
    	
    	//clear_stdin();
     
    	return str;
    }
     
    // 获取cmd命令
    char get_cmd(char start, char end)
    {
    	//clear_stdin();
     
    	printf("请输入命令:");
    	while(true)
    	{
    		char val = getch();
    		if(val >= start && val <= end)
    		{
    			printf("%c\n",val);
    			return val;
    		}
    	}
    }

    server.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdbool.h>
    //#include "getch.h"
    #include <conio.h>
    #include <WinSock2.h>
    #pragma comment(lib,"ws2_32.lib")		//加载ws2_32.dll
     
    #define MAX_Flight 50   // 最大航班数
    #define MAX_Passenger 20    // 单航班最多乘客数
    #define MAX_Order 50    // 最大订票数
     
    typedef struct Flight
    {
        char fid[20];       //航班号
    	char fname[20];	    //航班名称
        char start[10];     //起点
        char end[10];       //终点
        int fnum;	        //票数
    }Flight;
     
    typedef struct Passenger
    {
        char pid[20];	    //身份证
        char pname[10];	    //姓名
        char password[20];	//密码
    	char tell[20];	    //电话
    }Passenger;
     
    typedef struct Order
    {
        char pid[20];	//身份证
        char fid[20];	//航班号
    	int num;	    //票数
    }Order;
     
    Flight *FLI;    // 定义全局变量
    Passenger *PAS;
    Order *ORD;
    
    char search_fid[50][20];    // 符合条件的航班号
    int search_fnum[50];        // 符合条件的航班票数
    int online = 0;             // 是否登录的变量
    char online_pid[20];        // 在线用户的身份证
    int search_num = 0;         // 符合条件的航班数
    
    char *get_request_content(char *src, char *content, int max_len); // 解析请求的内容
    void init_sys(void);	     // 系统初始化
    char* show_flight(void);	 // 显示航班表
    void exit_sys(void);	     // 退出系统
    char* login(char* pid, char* pw);           // 登录
    char* logout(void);          // 用户登出
    char* passenger_info(void);  // 查询旅客信息
    char* order_ticket(char* fid);	 // 生成查询页面
    char* search(char* start, char* end);	         // 查询航班
    char* order_list(void);	     // 生成订单表
    char* del_order(char* fid);	     // 退票
    char* get_str(char* str,size_t len);  // 获取字符串
    char get_cmd(char start,char end);	  // 获取cmd命令
     
    // 主函数
    int main(int argv, char* argc[])
    {
        system("chcp 65001");
        printf("编码转换完毕\n");
        // 系统初始化
        init_sys();
    
    	// 初始化
    	WSADATA wsaData;
    	WSAStartup(MAKEWORD(2, 2), &wsaData);
    
    	//创建套接字
    	SOCKET servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    
    	//绑定套接字
    	struct sockaddr_in sockAddr;
    	memset(&sockAddr, 0, sizeof(sockAddr));		//每个字节用0填充
    	sockAddr.sin_family = PF_INET;				//使用ipv4
    	sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	sockAddr.sin_port = htons(8888);			//端口
    	bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));
    
    	//进入监听状态
    	listen(servSock, 20);
    
        char cmd[1024] = {0};
        char buf[10240] = {0};
    
        for(;;)
        {
            // 接收客户端消息
            SOCKADDR clntAddr;
            int nSize = sizeof(SOCKADDR);
            SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);
    
            memset(cmd, 0, sizeof(cmd));
            memset(buf, 0, sizeof(buf));
    
            printf("收到客户端命令:");
            recv(clntSock, cmd, 1024, 0);
            printf("%s\n", cmd);
            if(NULL != strstr(cmd, "exit_sys"))
            {
                //关闭套接字
    	        closesocket(clntSock);
                break;
            }
            else if(NULL != strstr(cmd, "search"))
            {
                char* start = get_request_content(cmd, "start:", 20);
                char* end = get_request_content(cmd, "end:", 20);
    
                snprintf(buf, 10240, "%s", search(start, end));
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            else if(0 == strncmp(cmd, "1.订票", 10))
            {
                snprintf(buf, 1024, "订票...\n");
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            else if(0 == strncmp(cmd, "0.返回", 10))
            {
                snprintf(buf, 1024, "返回...\n");
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            else if(NULL != strstr(cmd, "order_ticket"))
            {
                char* fid = get_request_content(cmd, "fid:", 20);
                snprintf(buf, 1024, "%s", order_ticket(fid));
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            else if(NULL != strstr(cmd, "order_list"))
            {
                snprintf(buf, 10240, "%s", order_list());
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            else if(NULL != strstr(cmd, "del_order"))
            {
                char* fid = get_request_content(cmd, "fid:", 20);
                snprintf(buf, 10240, "%s", del_order(fid));
            }
            else if(NULL != strstr(cmd, "passenger_info"))
            {
                snprintf(buf, 10240, "%s", passenger_info());
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            else if(NULL != strstr(cmd, "login"))
            {
                char* pid = get_request_content(cmd, "pid:", 20);
                char* pw = get_request_content(cmd, "pw:", 20);
                snprintf(buf, 10240, "%s", login(pid, pw));
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            else if(NULL != strstr(cmd, "logout"))
            {
                snprintf(buf, 10240, "%s", logout());
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            else
            {
                snprintf(buf, 20, "错误命令!");
                send(clntSock, buf, strlen(buf) + sizeof(char), 0);
            }
            //关闭套接字
    	    closesocket(clntSock);
        }
    
    	//关闭套接字
    	closesocket(servSock);
    
    	//终止dll使用
    	WSACleanup();
    
        exit_sys();	    // 退出系统
    
    	return 0;
    }
    
    // 解析请求的内容
    char *get_request_content(char *src, char *content, int max_len)
    {
    	char *result = (char *)malloc((max_len) * sizeof(char));
    	memset(result, 0, max_len);
    	int i = 0;
    	char *temp = NULL;
    	temp = strstr(src, content);
    	if (temp == NULL)
    	{
    		return NULL;
    	}
    	temp += strlen(content);
    	while (1)
    	{
    		if (max_len == i)
    			break;
    		if (temp[i] != ' ')
    		{
    			result[i] = temp[i];
    			i++;
    		}
    		else
    		{
    			break;
    		}
    	}
    	return result;
    }
     
    // 系统初始化
    void init_sys(void)
    {
    	// 申请堆内存、加载数据
    	FLI = calloc(MAX_Flight,sizeof(Flight));
    	PAS = calloc(MAX_Passenger,sizeof(Passenger));
    	ORD = calloc(MAX_Order,sizeof(Order));
    	printf("系统初始化中...\n");
     
        // 以只读方式打开 order.txt,如果文件不存在则打开失败,返回值为空。
    	FILE* ofrp = fopen("order.txt","r");
        if(NULL == ofrp)    // 打开失败直接退出
        {
            printf("order.txt 打开失败!\n");
            exit(0);
        }
     
        int i = 0;
    	for(i = 0; i < MAX_Order; i++)	//读取文本中的数据到内存,全局变量ORD中
    	{	
            int num = 0;
    		num = fscanf(ofrp,"%s %s %d\n", ORD[i].pid, ORD[i].fid, &ORD[i].num);
    	}
     
    	FILE* ffrp = fopen("flight.txt","r");
        if(NULL == ffrp)
        {
            printf("flight.txt 打开失败!\n");
            exit(0);
        }
    	for(i = 0; i < MAX_Flight; i++)
    	{
    		int num = 0;
    		num = fscanf(ffrp,"%s %s %s %s %d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, &FLI[i].fnum);
    	}
     
    	FILE* pfrp = fopen("passenger.txt","r");
        if(NULL == pfrp)
        {
            printf("passenger.txt 打开失败!\n");
            exit(0);
        }
    	for(i = 0; i < MAX_Passenger; i++)
    	{
    		int num = 0;
    		num = fscanf(pfrp,"%s %s %s %s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
    	}
    
        printf("系统初始化完毕!\n");
    }
     
    // 显示航班表
    char* show_flight(void)
    {
        static char buf[10240] = {0};
        memset(buf, 0, sizeof(buf));
        int i = 0;
    	for(i = 0; i < MAX_Flight; i++)
    	{
    		if(strlen(FLI[i].fid) != 0)
    		{
    			snprintf(buf, 10240, "%sid:%s name:%s start:%s end:%s fnum:%d\n", buf, FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, 
                    FLI[i].fnum);
    		}
    	}
    
        return buf;
    }
     
    // 系统结束
    void exit_sys(void)
    {
        printf("数据插入中...\n");
    	FILE* ofwp = fopen("order.txt","w");
    	printf("准备插入 order.txt\n");
    	int i= 0;
    	for(i = 0; i < MAX_Order; i++)	//数据存储回本地
    	{
    	    int num = 0;
    		if(strlen(ORD[i].pid) != 0)
    		{
    			num = fprintf(ofwp,"%s %s %d\n", ORD[i].pid, ORD[i].fid, ORD[i].num);
    			//printf("insert order.txt success\n");
    		}
    	}
     
        // 以只写方式打开文件flight.txt,如果文件不存在则创建,如果文件存在则把内容清空。
    	FILE* ffwp = fopen("flight.txt","w");
    	printf("准备插入 flight.txt\n");
    	for(i = 0; i < MAX_Flight; i++)
    	{
    		int num = 0;
    		if(strlen(FLI[i].fid) != 0)
    		{
    			num = fprintf(ffwp,"%s %s %s %s %d\n", FLI[i].fid, FLI[i].fname, FLI[i].start, FLI[i].end, FLI[i].fnum);
    			//printf("insert flight.txt success\n");
    		}
    	}
     
    	FILE* pfwp = fopen("passenger.txt","w");
    	printf("准备插入 passenger.txt\n");
    	for(i = 0; i < MAX_Passenger; i++)
    	{
    		int num = 0;
    		if(strlen(PAS[i].pid) != 0)
    		{
    			num = fprintf(pfwp,"%s %s %s %s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
    			//printf("insert passenger.txt success\n");
    		}
    	}
    	// 释放内存、保存数据
    	free(FLI);
    	free(PAS);
    	free(ORD);
    	printf("程序退出\n");
    }
     
    // 登录
    char* login(char* pid, char* pw)
    {
        static char buf[100] = {0};
        memset(buf, 0, sizeof(buf));
        if(online == 0)	//如果没有登录
        {
            int i = 0;
            int time = 0;
            // 遍历所有乘客
            for(i = 0; i < MAX_Passenger; i++)
            {
                // 数据长度校验
                if(strlen(pid) == 0 || strlen(pw) == 0)
                {
                    printf("pid 或 password 不能为空\n");
                    time++;
                    break;
                }
                // 成功匹配账号密码
                else if(strcmp(PAS[i].pid, pid) == 0 && strcmp(PAS[i].password, pw) == 0)
                {
                    snprintf(buf , 100, "登录成功!\n");
                    strncpy(online_pid, pid, 20);
                    online = 1;
                    return buf;
                }
                else if(i == MAX_Passenger-1)
                {
                    snprintf(buf , 100, "pid 或 password 错误\n");
                    return buf;
                }
            }
            
        }
        else if(online == 1)
        {
            snprintf(buf , 100, "你还没登录呢\n");
            return buf;
        }
        else
        {
            snprintf(buf , 100, "你已被锁定,禁止使用此系统\n");
            return buf;
        }
     
    }
     
    // 用户登出
    char* logout(void)
    {
        static char buf[100] = {0};
        memset(buf, 0, sizeof(buf));
        if(online == 1)	//如果已经登录
        {
            online = 0;
            snprintf(buf, 100, "登录成功\n");
        }
        else if(online == -1)
        {
            snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
        }
        else
        {
            snprintf(buf, 100, "你还没有登录呢\n");
        }
        
        return buf;
    }
     
    // 查询旅客信息
    char* passenger_info(void)
    {
        static char buf[100] = {0};
        memset(buf, 0, sizeof(buf));
        if(online == 1)	//如果已经登录
        {
            //printf("online_pid:");
            //puts(online_pid);
            int i = 0;
            for(i = 0; i < MAX_Passenger; i++)
            {
                if(strcmp(online_pid, PAS[i].pid) == 0)
                {
                    snprintf(buf, 100, "pid:%s, pname:%s, password:%s, tell:%s\n", PAS[i].pid, PAS[i].pname, PAS[i].password, PAS[i].tell);
                    break;
                }
            }
        }
        else if(online == -1)
        {
            snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
        }
        else
        {
            snprintf(buf, 100, "你还没有登录呢\n");
        }
    
        return buf;
    }
     
    // 订票
    char* order_ticket(char* fid)
    {
        static char buf[100] = {0};
        memset(buf, 0, sizeof(buf));
        if(online == 1) // 如果已经登录
        {
            if(0 == strlen(fid))
            {
                snprintf(buf, 100, "fid 为空\n");
                return buf;
            }
            int i = 0;
            for(i = 0; i < search_num; i++)
            {
                //printf("fid:%s s_fid:%s num:%d\n",fid,search_fid[i],search_fnum[i]);
                if(strcmp(fid,search_fid[i]) == 0 && search_fnum[i] > 0)    //查询到对应航班
                {
                    snprintf(buf, 100, "订票成功\n");
                    int j = 0;
                    for(j = 0; j < MAX_Flight; j++) // 遍历航班表
                    {
                        if(strcmp(fid, FLI[j].fid) == 0)
                        {
                            FLI[j].fnum--;	//票数减1
                            break;
                        }
                    }
    
                    int k = 0;
                    for(k = 0; k < MAX_Order; k++)  // 遍历订票表
                    {
                        //printf("ready insert...\n");
                        if(strlen(ORD[k].pid) == 0) // 在空位置插入数据
                        {
                            strcpy(ORD[k].pid, online_pid);  // 插入当前用户身份证
                            strcpy(ORD[k].fid, search_fid[i]);   // 插入当前选择的航班号
                            ORD[k].num = 1;
                            printf("插入订票信息成功\n");
                            break;
                        }
                    }
                    return buf;
                }
                else if(strcmp(fid,search_fid[i]) == 0 && search_fnum[i] == 0)
                {
                    snprintf(buf, 100, "无票\n");
                    return buf;
                }
                else if(i == MAX_Flight-1)
                {
                    snprintf(buf, 100, "不存在此fid\n");
                    return buf;
                }
            }
        }
        else if(online == -1)
        {
            snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
            return buf;
        }
        else
        {
            snprintf(buf, 100, "请登录!\n");
            return buf;
        }
    }
     
    // 查询航班
    char* search(char* start, char* end)
    {
        printf("[函数()] 进入 search(%s, %s)\n", start, end);
        static char buf[10240] = {0};
        memset(buf, 0, sizeof(buf));
    	int i = 0;
    	search_num = 0;
        // 遍历所有航班
    	for(i = 0; i < MAX_Flight; i++)
    	{
    	    if(strlen(start) == 0 || strlen(end) == 0)
    		{
    			snprintf(buf, 10240, "start 或 end 不能为空\n");
                printf("%s", buf);
    			return buf;
    		}
    		if(strcmp(FLI[i].start, start) == 0 && strcmp(FLI[i].end, end) == 0)
    		{
    			snprintf(buf, 10240, "%sfid:%s, 票数:%d\n", buf, FLI[i].fid, FLI[i].fnum);
    			strncpy(search_fid[search_num], FLI[i].fid, 20);
    			search_fnum[search_num] = FLI[i].fnum;
    			//printf("search_fid[%d]:%s, search_fun[%d]:%d\n",search_num,search_fid[search_num],search_num,search_fnum[search_num]);
    			++search_num;
    		}
    		if(0 == search_num && i == MAX_Flight-1)
    		{
                snprintf(buf, 10240, "没有航班\n");
                printf("%s", buf);
    			return buf;
    		}
    		if(search_num > 0 && i == MAX_Flight-1)
    		{
                printf("%s", buf);
    			return buf;
    		}
    	}
    
        return buf;
    }
     
    // 输出订单信息
    char* order_list(void)
    {
        static char buf[10240] = {0};
        memset(buf, 0, sizeof(buf));
        if(online == 1)
        {
            int i = 0;
            for(i = 0; i < MAX_Order; i++)
            {
                if(strcmp(online_pid, ORD[i].pid) == 0)
                {
                    //printf("online_pid:%s\n",online_pid);
                    snprintf(buf, 10240, "%sfid:%s, pid:%s, ticket:%d\n", buf, ORD[i].fid, ORD[i].pid, ORD[i].num);
                }
            }
        }
        else if(online == -1)
        {
            snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
        }
        else
        {
            snprintf(buf, 100, "请登录!\n");
        }
    
        return buf;
    }
     
    // 删除订单
    char* del_order(char* fid)
    {
        printf("[函数()] 进入 del_order(%s)\n", fid);
        static char buf[100] = {0};
        memset(buf, 0, sizeof(buf));
        if(online == 1)
        {
            int i = 0;
            // 遍历所有订单
            for(i = 0; i < MAX_Order; i++)
            {
                if(strlen(fid) == 0)  //判空
                {
                    snprintf(buf, 100, "del_order 的 fid 不能为空\n");
                    return buf;
                }
                if(strcmp(fid, ORD[i].fid) == 0)
                {
                    memset(ORD[i].pid, '\0', sizeof(ORD[i].pid));
                    int j = 0;
                    for(j = 0; j < MAX_Flight; j++)
                    {
                        if(strcmp(fid, FLI[j].fid) == 0)
                        {
                            FLI[j].fnum++;  // 返还飞机票
                            break;
                        }
                    }
                    snprintf(buf, 100, "删除成功\n");
                    return buf;
                }
            }
        }
        else if(online == -1)
        {
            snprintf(buf, 100, "你已被锁定,禁止使用此系统\n");
        }
        else
        {
            snprintf(buf, 100, "请登录!\n");
        }
    
        printf("%s", buf);
        return buf;
    }
     
    // 清理输入缓冲区
    /*void clear_stdin(void)
    {
    	stdin->_IO_read_ptr = stdin->_IO_read_end;//清理输入缓冲区
    }
    */
     
    // 读取输入字符串
    char* get_str(char* str, size_t len)
    {
    	if(NULL == str)
    	{
    		puts("空指针!");
    		return NULL;
    	}
     
    	char *in = fgets(str, len, stdin);
     
    	size_t cnt = strlen(str);
    	if('\n' == str[cnt-1])
    	{
    		str[cnt-1] = '\0';
    	}
    	else
    	{
    		scanf("%*[^\n]");
    		scanf("%*c");
    	}
    	
    	//clear_stdin();
     
    	return str;
    }
     
    // 获取cmd命令
    char get_cmd(char start, char end)
    {
    	//clear_stdin();
     
    	printf("请输入命令:");
    	while(true)
    	{
    		char val = getch();
    		if(val >= start && val <= end)
    		{
    			printf("%c\n",val);
    			return val;
    		}
    	}
    }
    

    展开全文
  • 使用C语言开发,使用单链表实现,通过命令行作输入,且实现文件保存与加载,是学习C语言必须编写的应用例子,通过该实际的项目,将所有学的C语言的知识灵活的运用起来,同时可以提升自己对软件工程的理解
  • 基于C语言实现的超市管理系统

    千次阅读 多人点赞 2019-07-18 23:11:38
    超市随着市场经济和现代信息技术的的发展,不可必要的要卷入信息现代化的大潮,如何使用现代化的工具,使企业和经营者个人在最小的投入获取最大的回报,成为每一个人的梦想。因此,在超市管理中引进现代化的办公...

    1 需求分析

    超市随着市场经济和现代信息技术的的发展,不可必要的要卷入信息现代化的大潮,如何使用现代化的工具,使企业和经营者个人在最小的投入下获取最大的回报,成为每一个人的梦想。因此,在超市管理中引进现代化的办公软件,就成为时下最好的解决办法。使用软件办公,不仅能使经营者的劳力资本减少,同时能使超市的管理更规范更合理,解决了超市中用于管理进出货以及购买、库存等众多繁琐、工作量巨大从而导致耗费人员过多,超市经营紊乱等众多问题。

    1.1 主要功能

    • 超级管理员模块:(需帐号登录)

      • 添加管理员
      • 删除管理员
    • 管理员模块:(需帐号登录)

      • 商品信息录入(编号、名称、单价、库存)
      • 商品信息修改(修改商品的各种信息)
      • 商品信息查询(根据所输入的商品名字,编码查询库存信息)
      • 商品信息删除(从商品文件中删除商品信息)
      • 商品信息排序(按编号,单价,库存3种模式进行排序)
      • 输出商品全部库存信息
      • 删除普通用户功能(管理员有权限删除普通用户帐号)
    • 普通用户模块:(需帐号登录)

      • 新用户注册
      • 用户登录:
        • 商品查询
        • 商品排序
        • 输出商品全部库存信息
        • 购买商品(通过用户余额来进行购买)
        • 充值(通过输入充值卡卡号对用户余额充值)
        • 修改用户密码

    1.2 运行环境

    • 操作系统:Windows NT/2000/XP/VISTA/WIN7/WIN8/WIN10

    • 开发平台:Microsoft Visual Studio 2012

    点击此处下载文档和源码

    展开全文
  • 学生管理系统 C语言

    2017-12-22 14:55:09
    增删改查排序(win32控制台应用程序)table.txt内为随机信息
  • C语言学生管理系统增删改查

    万次阅读 多人点赞 2018-09-17 20:02:02
    本身意义可能不大,但是有很多学生再刚开始学习的时候,往往布置的大作业就是利用C语言实现简单的控制台管理系统,往往要求使用的结构是 在内存中用链表存储数据 从txt中读取信息,并可以删除写入 完成信息的展示...

    基于C语言和txt文件的增删改查

    转载请注明出处

    1、背景

    本系统基于学生信息管理,完成了学生的信息的读取、增加、删除、修改、查询。本身意义可能不大,但是有很多学生再刚开始学习的时候,往往布置的大作业就是利用C语言实现简单的控制台管理系统,往往要求使用的结构是

    • 在内存中用链表存储数据
    • 从txt中读取信息,并可以删除写入
    • 完成信息的展示、增加、删除、修改、查询

    以上就是最简单的功能,其他的功能也就是逻辑复杂一些,但是最终都会归结在这些操作上,用txt操作的意义何在?如果真的要做系统的话,应该使用数据库的,但是往往做这个系统的学生还没有学习数据库,所以数据就用简单的txt存储就行了。

    2、环境

    VS2015 +win10 别的编译器也可以,可以会有略微不一样

    3、目的

    1. 练习和熟悉基本的语法。
    2. 理解链表这种数据结构,查找、删除等操作,以及和数组的区别
    3. 简单的容错机制、健壮性
    4. 字符串处理以及指针的理解
    5. 如果是小组合作的话,还涉及到合作分工集成,集成对新手来说是个很头疼的问题

    4、定义数据结构

    /*定义一个学生类型*/
    typedef struct student
    {
        char stuid[16];//学号
        char name[16];//学生姓名
        int num;//学生学号
        struct student* next;//下一个学生的指针
    }Stu;
    
    Stu* students;//学生链表
    char* stuInfo="test.txt";//学生信息存储的文件
    int input = 0;//选择
    char tempInput[64];
    char tempName[64];
    char tempStuid[64];
    int tempNum = 0;

    以上是我作为示例定义的简单数据结构,结构体中是学生的学号、姓名、学号、指向下一个结构体的指针。
    students是链表的头节点
    stuInfo存储的是学生信息txt的路径,这里的txt和工程或exe放一个层级,当然可以自己改成自己的
    temp...都是用来接收一些数据用的变量

    5、定义功能函数

    void initFromTxt(void);//初始化读入信息
    void deleteInfo(char* stuid);//删除一条信息
    void reWrite(void);//将内存中的信息,写入txt
    void insert2txt(Stu* stu);//插入一条信息进入文本
    int addinfo(char* stuid, char* name, int num);//增加一条信息
    void modify(char* stuid, char*name, int num);//修改一条信息
    int checkAdd(char* stuid);//判断学号输入是否存在
    void showInfo(void);//展示学生信息
    Stu* findInfo(char* stuid);//查找学生信息
    void view(void);//界面
    int checkInput(char* input, int begin, int end);//判断输入是否再给定的范围内

    6、实验结果

    1、初始文本文件

    初始文本

    2、主菜单

    这里写图片描述

    7、说明

    本系统还不是很完善,有很多细节可以扣,尤其在容错这方面,基本都没怎么处理,只是像呈现出来这些功能罢了,展现一个基本的操作,链表查询,删除、插入,读写文件之类的。

    8、代码部分

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    /*定义一个学生类型*/
    typedef struct student
    {
        char stuid[16];//学号
        char name[16];//学生姓名
        int num;//学生学号
        struct student* next;//下一个学生的指针
    }Stu;
    
    Stu* students;//学生链表
    char* stuInfo="test.txt";//学生信息存储的文件
    int input = 0;//选择
    char tempInput[64];
    char tempName[64];
    char tempStuid[64];
    int tempNum = 0;
    
    
    void initFromTxt(void);//初始化
    void deleteInfo(char* stuid);//删除信息
    void reWrite(void);//重写
    void insert2txt(Stu* stu);//插入文本
    int addinfo(char* stuid, char* name, int num);//增加信息
    void modify(char* stuid, char*name, int num);//修改信息
    int checkAdd(char* stuid);//判断学号输入
    void showInfo(void);//展示信息
    Stu* findInfo(char* stuid);//查找信息
    void view(void);//界面
    int checkInput(char* input, int begin, int end);//判断输入是否再给定的范围内
    
    void initFromTxt(void)
    {
        students = (Stu*)malloc(sizeof(Stu));//给链表的头节点分配内存
        students->next = NULL;//指向设为空
        FILE* file;
        file = fopen(stuInfo, "r");//打开信息文件
        if (file == NULL)
        {
            printf("[initFromTxt]打开文件失败!");
            return;
        }
        Stu* s = students;//当前结点
        while (1)
        {
            Stu* stu = (Stu*)malloc(sizeof(Stu));
            //从文本读入学生信息,存进stu中
            if (fscanf(file, "%s %s %d",&(stu->stuid) ,&(stu->name), &(stu->num)) == EOF)
            {
                //如果读入为EOF,也就说为读入为空,那么刚刚新建的stu就不要了,释放分配的内存
                free(stu);
                break;
            }   
            stu->next = NULL;
    
            s->next = stu;//将当前节点和新建的节点链接起来
            s = stu;//调整当前节点为新节点
        }
        fclose(file);
    }
    
    void deleteInfo(char* stuid)
    {
        Stu* stu = students->next;//当前节点
        Stu* pre = students;//当前节点的父节点
        int isFound = 0;//是否找到学生
        while (stu != NULL)
        {
            if (strcmp(stu->stuid, stuid) == 0)//判断id是否相同
            {
                pre->next = stu->next;
                free(stu);
                reWrite();//重写进文件
                isFound = 1;
                break;
            }
            pre = pre->next;
            stu = stu->next;
        }
        if (isFound)
        {
            printf("删除成功!\n");
        }
        else
        {
            printf("没有找到该记录!\n");
        }
    }
    
    void reWrite(void)
    {
        Stu* stu = students->next;
        FILE* file = fopen(stuInfo, "w");//清空文件
        fclose(file);
        if (stu == NULL)//这个代表当前没有学生,直接返回
        {
            return;
        }
    
        while (stu != NULL)
        {   
            insert2txt(stu);
            stu = stu->next;
        }
    
    }
    //插入一条学生信息进入文本文件
    void insert2txt(Stu* stu)
    {
        FILE* file;
        file=fopen(stuInfo,"a");
        if (file == NULL)
        {
            printf("[insert2txt]文件写入不成功!");
            return;
        }
        fprintf(file, "%s %s %d\n", stu->stuid,stu->name, stu->num);
        fclose(file);
    }
    
    int addinfo(char* stuid, char* name,int num)
    {
        if (!checkAdd(stuid))
        {
            printf("学号重复,不能添加!\n");
            return 0;
        }
        Stu* newinfo = (Stu*)malloc(sizeof(Stu));//新建一个新节点
        newinfo->next = NULL;
        //给新节点赋值
        strcpy(newinfo->stuid, stuid);
        strcpy(newinfo->name, name);
        newinfo->num = num;
        //调整p到最后一个节点
        Stu* p = students;
        while (p->next!=NULL)
        {
            p = p->next;
        }
        //p链接新节点
        p->next = newinfo;
        //插入新信息
        insert2txt(newinfo);
        return 1;
    }
    /*修改学生信息*/
    void modify(char* stuid,char*name,int num)
    {
        //修改信息是先删除再添加
        deleteInfo(stuid);
        if(addinfo(stuid,name,num))
            printf("修改成功!");
        else
            printf("修改失败!");
    }
    /*判断学号是否重复*/
    int checkAdd(char* stuid)
    {
        Stu* stu = students->next;
        while (stu != NULL)
        {
            if (strcmp(stu->stuid, stuid) == 0)
                return 0;
            stu = stu->next;
        }
        return 1;
    }
    
    /*打印所有信息*/
    void showInfo(void)
    {
        Stu* stu = students->next;
        while (stu!=NULL)
        {
            printf("%s %s, %d\n",stu->stuid ,stu->name, stu->num);
            stu = stu->next;
        }
        getchar();
        getchar();
    }
    
    /*根据学生信息查找学生*/
    Stu* findInfo(char* stuid)
    {
        Stu* stu = students->next;
        while (stu != NULL)
        {
            if (strcmp(stu->stuid, stuid) == 0)
                return stu;
            stu = stu->next;
        }
        return NULL;
    }
    
    void main(void)
    {
        initFromTxt();
        view(); 
    }
    
    /*判断输入是否再范围内,用来判断*/
    int checkInput(char* input,int begin,int end)
    {
        //如果不是一个字符,直接返回
        if (strlen(input) != 1)
        {
            return -1;
        }
        //判断输入是不在范围内
        if (input[0]<'0' + begin || input[0]>'0' + end)
        {
            return -1;
        }
        return input[0] - '0';
    }
    
    void view(void)
    {
    
        while (1)
        {
            system("cls");
            printf("****************************\n");
            printf("1.增加学生信息\n");
            printf("2.删除学生信息\n");
            printf("3.改变学生信息\n");
            printf("4.查询学生信息\n");
            printf("5.展示学生信息\n");
            printf("6.退出\n");
            printf("****************************\n");
            scanf("%s", tempInput);
            input = checkInput(tempInput,1,6);
            switch (input)
            {
            case 1:
                printf("请输入学号,姓名,数字(例如:20151111 张三 0)数据以空格隔开:");
                scanf("%s%s%d",tempStuid,tempName,&tempNum);
                addinfo(tempStuid, tempName, tempNum);
                break;
            case 2:
                printf("请输入学号:");
                scanf("%s", tempStuid);
                deleteInfo(tempStuid);
                break;
            case 3:
                printf("请输入学号:");
                break;
            case 4:
                printf("请输入学号:");
                scanf("%s", tempStuid);
                Stu* stu= findInfo(tempStuid);
                if (stu != NULL)
                {
                    printf("学号:%s\n姓名:%s\n数字:%d\n", stu->stuid, stu->name, stu->num);
                }   
                else
                {
                    printf("学号不存在!按任意键返回");
                    getchar(); getchar();
                }   
                break;
            case 5:
                showInfo();
                break;
            case 6:
                return;
                break;
            default:
                printf("输入错误!按任意键返回\n");
                getchar();getchar();
                break;
            }
        }
    
    }
    展开全文
  • 一个用工程来实现整合代码的成绩管理系统实现了各个文件中数据的传输,利用链表来实现保存数据,功能比较齐全,大一课程设计拿到95分,但是代码比较晦涩,用来入门学习是非常不错的代码
  • 1.win+x,选择Windows PowerShell(管理员) 2.输入: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 3.回车,输入Y,重启。 下载运行子系统 1.打开应用商店,搜索“Linux...
  • 相邻站发现并存储用于检索的 LLDP 代理由基于 SNMP 网络管理系统。 版本为:1.4.22 有疑问请联系 egaokiss@live.cn lldp汉化步骤: 1、安装原版 2、将“ChineseSimplified.ini”文件拷贝到“C:\Program Files\...
  • 通讯录管理系统.rar

    2019-06-24 10:24:00
    用C设计出模拟手机通信录管理系统实现对手机中的通信录进行管理。 功能要求: (1)查看功能:选择此功能时,列出下列三类选择。A 办公类 B 个人类 C 商务类 ,当选中某类时,显示出此类所有数据中的姓名和电话号码...
  • 软件结构是软件的灵魂!结构混乱的程序面目可憎,调试、测试、维护、升级都极度困难。 一个高尚的程序员应该是写出如艺术作品般程序的程序员。
  • /*----------------------------------------------------------------------------------------- ...鉴别root权限,设置管理员和学生权限,管理员和学生可以异步登录  (如果加入网络模块就可以实现多用户同步登录)
  • notepad++只是一个文件的编辑器 MInGW配置结束可以使用gcc编译 在windows使用C语言开发运行
  • C语言学生成绩管理系统内含设计文档 C语言学生成绩管理系统内含设计文档 C语言学生成绩管理系统内含设计文档

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,063
精华内容 9,625
关键字:

win下c语言实现文件管理系统