main.cpp
上传用户:cydzxjc
上传日期:2021-11-14
资源大小:2668k
文件大小:4k
源码类别:

STL

开发平台:

Visual C++

  1. // TextQuery.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "TextQuery.h"
  5. //返回值是指向string vector的指针
  6. vector<string>* retrieve_text();
  7. //将按换行符分割的字符串按空格分割成单词
  8. text_loc* separate_words(const vector<string> *text_file);
  9. //生成map
  10. extern map<string, loc*>* build_word_map(const text_loc *text_locations);
  11. //对map进行迭代
  12. void display_map_text(map<string, loc*> *text_map);
  13. string CTextQuery::filt_elems("",.;:!<<)(\/?~");
  14. int _tmain(int argc, _TCHAR* argv[])
  15. {
  16. CTextQuery tq;
  17. tq.doit();
  18. tq.query_text();
  19. tq.display_map_text();
  20. return 0;
  21. }
  22. vector<string>* retrieve_text()
  23. {
  24. string file_name;
  25. cout<<"please enter file name: ";
  26. cin>>file_name;
  27. //打开文本文件以便输入...
  28. ifstream infile(file_name.c_str(), ios::in);
  29. if (!infile)
  30. {
  31. cerr<<"oops! unable to open file "
  32. <<file_name<<"--bailing out!n";
  33. exit(-1);
  34. }
  35. else
  36. {
  37. cout<<'n';
  38. }
  39. vector<string> *lines_of_text = new vector<string>;
  40. string textline;
  41. typedef pair<string::size_type, int> stats;
  42. stats maxline;
  43. int linenum = 0;
  44. while (getline(infile, textline, 'n'))
  45. {
  46. cout<<"line read:"<<textline<<'n';
  47. if (maxline.first < textline.size())
  48. {
  49. maxline.first = textline.size();
  50. maxline.second = linenum;
  51. }
  52. lines_of_text->push_back(textline);
  53. linenum++;
  54. }
  55. return lines_of_text;
  56. }
  57. text_loc* separate_words(const vector<string> *text_file)
  58. {
  59. //words: 包含独立单词的集合
  60. //locations:包含相关的行/列信息
  61. vector<string> *words = new vector<string>;
  62. vector<location> *locations = new vector<location>;
  63. unsigned short line_pos = 0;   //当前行号
  64. //迭代文件中的每个行
  65. for (; line_pos < text_file->size(); ++line_pos)
  66. {
  67. //textline: 
  68. //word_pos: 
  69. short word_pos = 0;
  70. string textline = (*text_file)[line_pos];
  71. string::size_type pos = 0, prev_pos = 0;
  72. while ((pos = textline.find_first_of(' ', pos)) != string::npos)
  73. {
  74. //存储当前单词子串的拷贝
  75. words->push_back(textline.substr(prev_pos, pos - prev_pos));
  76. //将行/列信息存储为pair
  77. locations->push_back(make_pair(line_pos, word_pos));
  78. //为下一次迭代修改位置信息
  79. ++word_pos;
  80. prev_pos = ++pos;
  81. }
  82. //现在处理最后一个单词
  83. words->push_back(textline.substr(prev_pos, pos - prev_pos));
  84. locations->push_back(make_pair(line_pos, word_pos));
  85. }
  86. return new text_loc(words, locations);
  87. }
  88. map<string, loc*>* build_word_map(const text_loc *text_locations)
  89. {
  90. map<string, loc*> *word_map = new map<string, loc*>;
  91. vector<string> *text_words = text_locations->first;
  92. vector<location> *text_locs = text_locations->second;
  93. register int elem_cnt = text_words->size();
  94. for (int ix = 0; ix < elem_cnt; ++ix)
  95. {
  96. string textword = (*text_words)[ix];
  97. //排除策略:如果少于3个字符,
  98. //或在排除集合中存在,
  99. //则不输入到map中.
  100. if (textword.size() < 3 /*|| exclusion_set.cout(textword)*/)
  101. {
  102. continue;
  103. }
  104. //判断单词是否存在
  105. //如果count()返回0,则不存在--加入它
  106. if (!word_map->count((*text_words)[ix]))
  107. {
  108. loc *ploc = new vector<location>;
  109. ploc->push_back((*text_locs)[ix]);
  110. word_map->insert(val_Type((*text_words)[ix], ploc));
  111. }
  112. else
  113. {
  114. //修改该项的位置向量
  115. (*word_map)[(*text_words)[ix]]->push_back((*text_locs)[ix]);
  116. }
  117. }
  118. return word_map;
  119. }
  120. void display_map_text(map<string, loc*> *text_map)
  121. {
  122. typedef map<string, loc*> tmap;
  123. tmap::iterator iter = text_map->begin(), iter_end = text_map->end();
  124. while(iter != iter_end)
  125. {
  126. cout << "word: "<<(*iter).first<<" (";
  127. int loc_cnt = 0;
  128. loc *text_locs = (*iter).second;
  129. loc::iterator liter = text_locs->begin(), liter_end = text_locs->end();
  130. while(liter != liter_end)
  131. {
  132. if (loc_cnt)
  133. {
  134. cout<<',';
  135. }
  136. else
  137. {
  138. ++loc_cnt;
  139. }
  140. cout<<'('<<(*liter).first<<','<<(*liter).second<<')';
  141. ++liter;
  142. }
  143. cout<<")n";
  144. ++iter;
  145. }
  146. cout<<endl;
  147. }