📄 train_booking_fread.c
字号:
// train_booking_fileop.c -- 包含文件读取操作函数
//
/////////////////////////////////////////////////////////////////////////////
#ifndef TRAIN_BOOKING_FREAD_C_
#define TRAIN_BOOKING_FREAD_C_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
#include "train_booking_declare.h"
#include "train_booking_const.h"
#include "train_booking_unit.h"
#define _DEBUG_
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 生成默认的车站管理系统配置
//
// 函数参数: system_info_pt:车站信息结构体指针
//
/////////////////////////////////////////////////////////////////////////////
status create_default_system_settings(system_info *system_info_pt)
{
message(WARN, "正在重置系统配置信息...", NULL);
// 设置系统状态
system_info_pt->open = 1;
system_info_pt->locked = 0;
system_info_pt->total_train_sq = 0;
system_info_pt->total_train = 0;
system_info_pt->admin_amount = 0;
system_info_pt->psngr_amount = 0;
system_info_pt->train_sq_list.next = NULL;
// 设置默认起始站点
strcpy(system_info_pt->location, "武汉");
// 设置其他默认参数
system_info_pt->total_income = 0;
system_info_pt->total_sold = 0;
system_info_pt->price_hbed_per_km = 0.93;
system_info_pt->price_hseat_per_km = 0.42;
system_info_pt->price_sbed_per_km = 1.22;
system_info_pt->bounce_off = 0.6;
system_info_pt->special_off = 0.5;
// 将创建信息写入文件
if (save_system_info(system_info_pt))
{
message(INFO, "成功创建默认系统配置信息!", NULL);
}
else
{
message(ERROR, "创建默认系统配置信息时存储文件出错!", NULL);
message(WARN, "创建默认系统配置信息失败!", WC);
return FAIL;
}
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 从文件加载系统配置信息
//
// 函数参数: system_info_pt:车站信息结构体指针
//
/////////////////////////////////////////////////////////////////////////////
status load_system_settings(system_info *system_info_pt)
{
FILE *fp;
char filepath[MAX_FILE_PATH_LEN];
message(INFO, "正在加载系统配置信息...", NULL);
// 生成文件路径
create_i_dir(filepath, SYS_INFO_DIR, SYS_INFO_FILE);
// 检测文件有效性
if (!check_data(filepath, 0))
{
message(ERROR, "从文件加载系统配置信息失败!", C);
return FAIL;
}
// 只读二进制方式打开文件读取信息
fp = fopen(filepath, "rb");
fread(system_info_pt, sizeof(system_info), 1, fp);
fclose(fp); // 打开一个空文件也能读?
message(INFO, "系统配置信息加载成功。", NULL);
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 从文件加载车次信息链
//
// 函数参数: train_sq_info_head:车次信息链表头结点指针
// station_name:站点名称
// amount:车次数量
//
/////////////////////////////////////////////////////////////////////////////
status load_train_sq_info_list(train_sq_info *train_sq_info_head,
char *station_name, int amount)
{
FILE *fp;
char filepath[MAX_FILE_PATH_LEN];
train_sq_info *train_sq_info_pt;
int i, j, ok = 0;
printf("【信息】正在加载站点(%s)的车次信息...\n", station_name);
// 生成文件路径
create_i_dir(filepath, SYS_INFO_DIR, SQ_INFO_FILE);
// 检测文件有效性
if (!check_data(filepath, 1))
{
message(ERROR, "从文件加载车次信息失败!", WC);
return FAIL;
}
// 只读二进制方式打开文件读取信息
fp = fopen(filepath, "rb");
for (i = 0; i < amount; i++)
{
if (!(train_sq_info_pt = (train_sq_info *)malloc(sizeof(train_sq_info))))
{
message(ERROR, "加载车次信息时申请内存空间失败!", WC);
message(WARN, "加载车次信息完全失败!", WC);
// 释放无效内存
free_train_sq_info_list(train_sq_info_head);
return FAIL;
}
ok++;
fread(train_sq_info_pt, sizeof(train_sq_info), 1, fp);
// 检测车次与车站的从属关系
if (strcmp(station_name, train_sq_info_pt->master))
{
message(ERROR, "加载的车次信息不属于本车站!", NULL);
message(WARN, "加载车次信息完全失败!", WC);
// 释放无效内存
free_train_sq_info_list(train_sq_info_head);
free(train_sq_info_pt);
return FAIL;
}
// 链上车次信息
train_sq_info_head->next = train_sq_info_pt;
train_sq_info_head = train_sq_info_head->next;
// 加载该车次的所有列车标识
if (!(load_train_item_list(&train_sq_info_pt->train_item_list,
train_sq_info_pt->train_sq_id,
train_sq_info_pt->running_amount_valid)))
{
printf("【错误】加载车次(%s)的列车标识信息失败!\n",
train_sq_info_pt->train_sq_id);
message(WARN, "加载车次信息完全失败!", WC);
free_train_sq_info_list(train_sq_info_head); // 释放无效内存
return FAIL;
}
// 加载该车次的列车信息
if (!(load_train_info_list(&train_sq_info_pt->train_list,
train_sq_info_pt->train_sq_id,
&train_sq_info_pt->train_item_list,
train_sq_info_pt->running_amount_valid)))
{
printf("【错误】加载车次(%s)的列车信息失败!\n",
train_sq_info_pt->train_sq_id);
message(WARN, "加载车次信息完全失败!", WC);
free_train_sq_info_list(train_sq_info_head); // 释放无效内存
return FAIL;
}
}
if (ok)
{
train_sq_info_pt->next = NULL;
}
fclose(fp);
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 从文件加载列车信息链
//
// 函数参数: train_info_head:列车信息链表头结点指针
// sq_iq:车次编号,检测用
// amount:列车数量
//
/////////////////////////////////////////////////////////////////////////////
status load_train_info_list(train_info *train_info_head, char *sq_id,
train_item *train_item_head, int amount)
{
char filepath[MAX_FILE_PATH_LEN];
train_info *train_info_pt;
int i;
printf("【信息】正在加载车次(%s)的列车信息...\n", sq_id);
train_item_head = train_item_head->next; // 跳过头结点
// 根据时间标识符依次加载该车次的所有列车
for (i = 0; i < amount; i++)
{
if (!(train_info_pt = (train_info *)malloc(sizeof(train_info))))
{
message(ERROR, "加载列车信息链时申请内存失败!", WC);
free_train_info_list(train_info_head); // 释放无效内存
return FAIL;
}
// 加载单个列车基本信息
if (!(load_single_train_info(train_info_pt, sq_id,
train_item_head->train_time_id, 1)))
{
printf("【错误】加载车次(%s)的列车信息失败!\n", sq_id);
message(WARN, "加载列车息完全失败!", WC);
free_train_info_list(train_info_head); // 释放无效内存
return FAIL;
}
// 检测列车与车次、时间标识的从属关系
if ((strcmp(sq_id, train_info_pt->master)) ||
(strcmp(train_item_head->train_time_id, train_info_pt->time_id)))
{
message(ERROR, "加载的列车信息不属于本车次!", NULL);
message(WARN, "加载列车信息完全失败!", WC);
// 释放无效内存
free_train_info_list(train_info_head);
free(train_info_pt);
return FAIL;
}
// 加载座位信息数组
if (!(load_dot_info_list(&train_info_pt->sbed_info_list,
&train_info_pt->hbed_info_list,
&train_info_pt->hseat_info_list,
sq_id, train_info_pt->time_id,
SOFT_BED_CAR, HARD_BED_CAR, HARD_SEAT_CAR)))
{
printf("【错误】加载车次(%s)的车厢信息失败!\n", sq_id);
message(WARN, "加载列车息完全失败!", WC);
free_train_info_list(train_info_head); // 释放无效内存
return FAIL;
}
// 加载站点信息双链
if (!(load_station_info_list(&train_info_pt->station_links, sq_id,
train_info_pt->time_id,
train_info_pt->total_station)))
{
printf("【错误】加载车次(%s)的站点信息失败!\n", sq_id);
message(WARN, "加载列车息完全失败!", WC);
free_train_info_list(train_info_head); // 释放无效内存
return FAIL;
}
// 链上表尾
train_info_head->next = train_info_pt;
train_info_head = train_info_head->next;
// 列车标识信息同步推进
if (train_item_head = train_item_head->next)
{
train_item_head = train_item_head->next;
}
else
{
message(ERROR, "根据列车标识信息加载列车信息时两者不一致错误!", NULL);
message(WARN, "加载列车息完全失败!", WC);
free_train_info_list(train_info_head); // 释放无效内存
return FAIL;
}
}
train_info_pt = NULL;
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 从文件加载列车标识信息链
//
// 函数参数: train_item_head:列车标识信息链头结点指针
// sq_id:车次编号
// amount:标识数量
//
/////////////////////////////////////////////////////////////////////////////
status load_train_item_list(train_item *train_item_head, char *sq_id, int amount)
{
int i;
FILE *fp;
train_item *train_item_pt;
char filepath[MAX_FILE_PATH_LEN];
printf("【信息】正在加载车次(%s)的所有列车标识信息...\n", sq_id);
// 生成文件路径
create_ii_dir(filepath, TRAIN_INFO_DIR, sq_id, SQ_ITEM_FILE);
// 检测文件有效性
if (!check_data(filepath, 1))
{
message(ERROR, "从文件加载列车标识信息失败!", WC);
return FAIL;
}
fp = fopen(filepath, "rb");
for (i = 0; i < amount; i++)
{
// 从文件中读取列车标识信息
if (!(train_item_pt = (train_item *)malloc(sizeof(train_item))))
{
message(ERROR, "加载列车标识信息时读申请内存失败!", NULL);
message(WARN, "加载列车标识信息失败!", WC);
free_train_item_info_list(train_item_head); // 释放无效内存
return FAIL;
}
fread(train_item_pt, sizeof(train_item), 1, fp);
// 检测列车标识与车次的从属关系
if (strcmp(sq_id, train_item_pt->master))
{
message(ERROR, "加载的列车标识信息不属于本车次!", NULL);
message(WARN, "加载列车标识信息完全失败!", WC);
// 释放无效内存
free_train_item_info_list(train_item_head);
free(train_item_pt);
return FAIL;
}
train_item_head->next = train_item_pt;
train_item_head = train_item_head->next ;
}
train_item_pt->next = NULL;
fclose(fp);
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 从文件加载单个列车信息
//
// 函数参数: train_info_pt:内存缓冲区
// sq_id:列车所属车次编号
// time_id:列车的时间标识符
// check_expired:是否加载过期列车:1(否);0(是)
//
/////////////////////////////////////////////////////////////////////////////
status load_single_train_info(train_info *train_info_pt, char *sq_id,
char *time_id, char check_expired)
{
char filepath[MAX_FILE_PATH_LEN];
struct tm tm_tmp;
FILE *fp;
train_info train_info_buf;
time_t cur_time, train_time;
printf("【信息】正在加载车次为(%s),时间标识为(%s)的列车信息...\n",
sq_id, time_id);
create_iii_dir(filepath, TRAIN_INFO_DIR, sq_id,
time_id, TRAIN_INFO_FILE); // 生成列车信息文件路径
// 检测文件有效性
if (!check_data(filepath, 1))
{
message(ERROR, "从文件加载单个列车信息失败!", WC);
return FAIL;
}
fp = fopen(&train_info_buf, fp);
get_current_time(&tm_tmp, &cur_time); // 获得当前标准时间
train_time = mktime(&train_info_buf.start_tm); // 获得火车启动的标准时间
if ((1==check_expired) && (train_time<cur_time)) // 火车启动时间晚于当前时间
{
message(WARN, "该列车已过期,终止加载信息!", NULL);
return ABORT;
}
else
{
*train_info_pt = train_info_buf; // 写入信息
}
fclose(fp);
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 从文件加载列车途经站点信息链
//
// 函数参数: station_info_head:中途站点信息链头结点指针
// sq_id:车次编号
// timd_id:该趟列车的时间标识符
// amonut:站点数量
//
/////////////////////////////////////////////////////////////////////////////
status load_station_info_list(station_info *station_info_head,
char *sq_id, char *time_id, int amount)
{
int i;
station_info *station_info_pt;
char filepath[MAX_FILE_PATH_LEN];
FILE *fp;
printf("【信息】正在加载列车(%s)的所有途经站点信息...\n", sq_id);
station_info_head->pre = NULL; // 头结点没有前趋
create_iii_dir(filepath, TRAIN_INFO_DIR, sq_id,
time_id, STATION_INFO_FILE); // 生成文件路径
// 检测文件有效性
if (!check_data(filepath, 1))
{
message(ERROR, "从文件加载列车途经站点信息失败!", WC);
return FAIL;
}
fp = fopen(filepath, "rb");
for (i = 0; i < amount; i++)
{
if (!(station_info_pt = (station_info *)malloc(sizeof(station_info))))
{
message(ERROR, "加载列车站点时申请内存失败!", NULL);
message(WARN, "加载列车站点信息失败!", WC);
free_station_info_list(station_info_head); // 释放无效内存
return FAIL;
}
fread(station_info_pt, sizeof(station_info), 1, fp);
// 检测站点与车次、列车时间标识的从属关系
if ((strcmp(sq_id, station_info_pt->master)) ||
(strcmp(time_id, station_info_pt->time_id)))
{
message(ERROR, "加载的站点信息不属于本车次!", NULL);
message(WARN, "加载站点信息完全失败!", WC);
// 释放无效内存
free_station_info_list(station_info_head);
free(station_info_pt);
return FAIL;
}
// 双向链表赋指针
station_info_head->next = station_info_pt;
station_info_pt->pre = station_info_head;
station_info_head = station_info_head->next; // 向后移指针
}
station_info_pt->pre = station_info_head; // 尾结点接头
station_info_pt->next = NULL; // 尾结点封尾
fclose(fp);
return OK;
}
/////////////////////////////////////////////////////////////////////////////
// 函数功能: 从文件加载列车软卧信息数组
//
// 函数参数: sbed_arr:软卧信息结构数组首地址
// sq_id:车次编号
// timd_id:该趟列车的时间标识符
// amonut:软卧车厢数量
//
/////////////////////////////////////////////////////////////////////////////
status load_sbed_info_list(sbed_info *sbed_arr, char *sq_id,
char *time_id, int amount)
{
char filepath[MAX_FILE_PATH_LEN];
FILE *fp;
printf("【信息】正在加载列车(%s)的软卧车厢信息...\n", sq_id);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -