c++ - C ++中文本文件中的重复单词
问题描述
该程序查找单词并删除所有在文本文件中重复的单词。在这里,我通过输入一个特定的单词编写了这段代码,但我希望程序自己找到单词的种类,结果只显示不重复的单词。我已经尽力而为,但失败了。你能建议我找到更好的方法吗?
int main()
{
ifstream fin("name.txt");
ofstream fout("result.txt");
string word;
string line;
int pos;
int ccount=0;;
cout<<"Please input word:";
cin>>word;
while(getline(fin,line))
{
pos= 0;
while(line.find(word,pos)!=string::npos)
{
pos = line.find(word,pos);
line.erase(pos,word.length());
}
fout<<line<<endl;
}
fin.close();
fout.close();
}
解决方案
您可以std::vector
在阅读时使用 a 来跟踪单词,并使用 astd::set
确保只将其添加到std::vector
. 您想要的原因std::vector
是因为std::set
不会将std::string
s 保持在插入顺序中。这应该做的工作:
#include <algorithm>
#include <fstream>
#include <unordered_set>
#include <sstream>
#include <string>
#include <vector>
int main()
{
std::vector<std::string> words;
std::unordered_set<std::string> uniqueWords;
std::ifstream fin("in.txt");
if (fin.is_open())
{
std::string line;
while (getline(fin, line))
{
std::istringstream iss(line);
for (std::string word; iss >> word;)
{
std::string lowercaseWord = word;
std::transform(word.begin(), word.end(), lowercaseWord.begin(), ::tolower);
if (uniqueWords.find(lowercaseWord) == uniqueWords.end())
{
uniqueWords.insert(lowercaseWord);
words.push_back(word);
}
}
}
fin.close();
}
std::ofstream fout("out.txt");
if (fout.is_open())
{
for each (std::string word in words)
{
fout << word << " ";
}
fout.close();
}
return 0;
}
推荐阅读
- google-app-engine - 仅由 Google App Engine 发出的 Google Cloud Functions http 请求
- java - 有什么办法可以解决“java.lang.RuntimeException: Unable to find a free port”的问题
- angular - 用 papaparse 解析数据显示奇怪
- javascript - 带有移动文本的横幅,根据宽度自动调整 div 大小并保留正文宽度
- entity-framework - 两张桌子(一对多)和一张桌子有很多(一对零或一张)和一张桌子
- angular - 如何读取数组对象列表
- c# - 在 Moq 中使用任何结构参数验证方法调用
- c# - Handing Serial Port DataRecieved event when havign a method to handle reply from serial port at the same time
- django - Django-filter ForeignKey 相关模型过滤
- javascript - 如何在 MarkLogic JSON 中搜索文件中特定路径的键值?