C++实现电子词典项目,适合进阶
// Dictionary.cpp : 定义控制台应用程序的入口点。// vs2013 编译
//字典文件下载:https://pan.baidu.com/s/1YHtwptaq_V8j034U9_J96A,解压后放在程序同目录
#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <fstream>
#include <io.h>
#include <thread>
#include <time.h>
#include <Windows.h>
using namespace std;
class ParseDirectory
{
public:
ParseDirectory(string path){
this->path = path;
getFiles(files);
isdone = false;
t = thread(&ParseDirectory::txtToDic, this);
t.join();
}
bool isDone()
{
return isdone;
}
map<string, string> getDic()
{
return vecDics;
}
virtual ~ParseDirectory()
{
}
private:
vector<string> files;
string path;
thread t;
map<string, string> vecDics;
bool isdone;
void getFiles(vector<string>& files)
{
//文件句柄
long hFile = 0;
//文件信息
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
if ((fileinfo.attrib &_A_SUBDIR))
{
//if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
//getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
continue;
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
void txtToDic()
{
for each (string file in files)
{
fstream f(file);
string word, explain;
//map<string, string> dic;
if (f.is_open())
{
cout << file << endl;
while (1)
{
getline(f, word);
if (!getline(f, explain))
break;
vecDics = explain;
}
}
f.close();
//vecDics.push_back(dic);
}
isdone = true;
cout << vecDics.size() << endl;
}
};
void setColor(unsigned short ForeColor = 2, unsigned short BackGroundColor = 0)
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//获取当前窗口句柄
SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//设置颜色
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<ParseDirectory*> pds;
vector<map<string, string> > allWords;
for (int i = 0; i < 26; i++)
{
string name = ".\\";
name += 'A' + i;
cout << name << endl;
pds.push_back(new ParseDirectory(name));
}
int cnt = 0;
for (int i = 0; i < pds.size(); i++)
{
if (pds->isDone())
{
cnt++;
allWords.push_back(pds->getDic());
}
if (cnt == pds.size())
break;
}
string inquir;
while (1)
{
bool flag = false;
setColor();
cout << "输入要查询的单词:";
cin >> inquir;
for (int i = 0; i < allWords.size(); i++)
{
autot = allWords;
if (t.size())
{
setColor(7, 0);
cout << t << endl;
flag=true;
}
}
if (!flag)
{
setColor(4, 0);
cout << "抱歉,未找到单词" << endl;
}
}
system("pause");
return 0;
}
运行效果:
这么神奇吗,我试试看 在哪里看见过,传智的视频吗? 学习一下,谢谢 我之前也写过这个练手,但是功能要好一些,更多更全一点,改天整理一下发出来,楼主挺热心。 狂龙@ 发表于 2018-11-2 11:08
在哪里看见过,传智的视频吗?
不是{:1_924:}。。。。 感谢分享,字典的内容是怎么弄到的? 谢谢楼主分享,我还很少用C++单纯的DOS界面写过什么东西呢 感谢楼主分享,长见识了 练手,感谢
页:
[1]
2