C++多线程实现电子词典

所属分类: 软件编程 / C 语言 阅读数: 99
收藏 0 赞 0 分享

本文实例为大家分享了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[word] = explain;
  }
  }
  f.close();
  //vecDics.push_back(dic);
 }
 
 //cout << vecDics.size() << endl;
 isdone = true;
 
 }
};
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;
 cout << "正在加载资源...";
 long start = clock();
 vector<map<string, string> > allWords;
 for (int i = 0; i < 26; i++)
 {
 string name = ".\\";
 name += 'A' + i;
 pds.push_back(new ParseDirectory(name));
 }
 int cnt = 0;
 
 for (int i = 0; i < pds.size(); i++)
 {
 if (pds[i]->isDone())
 {
  cnt++;
  allWords.push_back(pds[i]->getDic());
  Sleep(300);
 }
 if (cnt == pds.size())
  break;
 }
 system("cls");
 cout << "加载完成!" << "耗时:" << (clock()-start)/1000.0 << "s" << endl;
 cout << allWords.size();
 string inquir;
 while (1)
 {
 bool flag = false;
 setColor();
 cout << "\n输入要查询的单词:";
 setColor(7, 0);
 cin >> inquir;
 for (int i = 0; i < allWords.size(); i++)
 {
  auto t = allWords[i][inquir];
  if (t.size())
  {
  
  cout << t << endl;
  flag=true;
  }
 }
 if (!flag)
 {
  setColor(4, 0);
  cout << "抱歉,未找到单词" << endl;
 }
 }

 
 system("pause");
 return 0;
}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

C++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多