?? 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 + -