#define _CRT_SECURE_NO_WARNINGS // 关闭安全性检查
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dict.h"
void main()
{
struct Dict * pDictList = NULL; // 定义词典词条数组指针变量
struct Dict * pDict = NULL; // 定义词典词条指针变量
struct Record * pRecordList = NULL;// 定义记录词条数组指针变量
struct Record * pRecord = NULL; // 定义记录词条指针变量
// 打开记录文件和词典文件
char key[1024] = { 0 };
printf("请输入词典文件名:\n");
scanf("%s", key);
printf("正在加载词典数据\n");
int dictCount = open_dict(&pDictList, key);
if (dictCount == 0) // 词典词条文件打开失败
{
release_dict(&pDictList, 0); // 释放词典词条数组占用的内存空间
exit(0); // 打开文件失败,程序退出
}
printf("正在加载记录数据\n");
// 打开记录词条文件,获取记录词条数量
int recordCount = open_record(&pRecordList, RECORD_FILE);
int flag = 0; // 标识变量,用于标识是否添加了新的记录数据
// 死循环,使程序一直运行,防止退出
while (1)
{
// 初始化数组key和content
memset(key, 0, sizeof(key));
pDict = NULL;
printf("\n");
printf("请输入单词或命令:\n");
scanf("%s", key); // 从键盘获取用户的输入
// 如果输入“$exit”就跳出循环
if (strncmp(key, "$exit", 5) == 0)
{
break;
}
// 如果输入“$review”打印收藏的单词并重新开始循环
if (strncmp(key, "$review", 7) == 0)
{
list_collect(pRecordList, recordCount, pDictList, dictCount);
continue;
}
// 根据用户的输入,在字典中检索
pDict = search_dict(pDictList, dictCount, key);
if (pDict != NULL) // 找到对应的词典数据
{
printf("%s\n", pDict->content);
// 在记录列表中查找单词
pRecord = search_record(pRecordList, recordCount, key);
if (pRecord == NULL) // 返回不为空说明该单词在记录列表中
{
pRecord = &pRecordList[recordCount];// 记录词条数组添加新元素
// 将指针变量key指向新申请的内存空间
pRecord->key = (char *)calloc(strlen(key) + 1, 1);
strncpy(pRecord->key, key, strlen(key));// 复制单词到内存空间
recordCount++; // 记录词条数组的元素数量+1
pRecord->count = 0; // 该单词已被查询0次
pRecord->mark_flag = 0;// 该单词还未被收藏
}
pRecord->count++;
flag = 1; // 标识记录词条数组已被改动
printf("you have searched \"%s\" %d times\n", key, pRecord->count);
// 单词未被收藏
if (pRecord->mark_flag == 0)
{
if (pRecord->count > NEED_COLLECT) // 单词已被查询指定次数
{
printf("---- I think you should collect this word. -----\n");
}
else // 单词未被查询指定次数
{
printf("---- Are you want to collect this word? ----\n");
}
printf("input Y(y) to collect\n");
fflush(stdin); // 清空输入流,防止回车符被getchar()函数获取
char c = getchar(); // 获取用户输入的字符
// 如果用户输入“y”或“Y”,将单词设置为已收藏
if (c == 'y' || c == 'Y')
{
pRecord->mark_flag = 1; // 设置单词为已收藏
printf("该单词已被成功收藏\n");
}
}
}
else // 未找到对应的翻译
{
printf("not found\n");
}
}
if (flag) // 如果记录词条数据已被改动,将记录词条数组写入记录词条文件中
{
flush_record(pRecordList, recordCount, RECORD_FILE); // 写入文件
}
printf("正在释放记录数据\n");
release_record(&pRecordList, recordCount);
printf("正在释放词典数据\n");
release_dict(&pDictList, dictCount);
}