Следующий код компилируется и выполняется, но в файл ничего не записывается, и я не могу понять, почему. Файл создается, но файл пуст. Я старался каждый раз удалять файл на всякий случай, но это не должно иметь значения
#include <algorithm>
#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
#include <map>
#include <set>
using namespace std;
int main(){
set<string> exclusionSet;
ifstream stopWords("stopwords.txt");
copy(istream_iterator<string>(stopWords),
istream_iterator<string>(),
inserter(exclusionSet, exclusionSet.end()));
stopWords.close();
//for_each(exclusionSet.begin(),
// exclusionSet.end(),
// [](const string& s){cout<<s<<endl;});
map<string, int> wordMap;
ifstream words("sample_doc.txt");
copy_if (istream_iterator<string>(words),
istream_iterator<string>(),
inserter(exclusionSet, exclusionSet.end()),
[=](const string& s){return exclusionSet.find(s)!=exclusionSet.end();});
ofstream out("frequency.txt");
for_each(begin(wordMap),
end(wordMap),
[&out](const pair<const string, int>& e){ out<<e.first<<" "<<e.second<<endl;});
out.close();
return 0;
}





Я бы предложил следующую версию исправлений
int main()
{
map<string, int> wordMap;
set<string> exclusionSet;
ifstream stopWords("stopwords.txt");
copy(istream_iterator<string>(stopWords), istream_iterator<string>(), inserter(exclusionSet, exclusionSet.end()));
stopWords.close();
vector<string> strings;
ifstream words("sample_doc.txt");
copy_if (istream_iterator<string>(words), istream_iterator<string>(), inserter(strings, strings.end()),
[=](const string& s)
{
return exclusionSet.find(s) == exclusionSet.end();
});
words.close();
for(auto &a : strings)
wordMap[a] = wordMap[a] + 1;
ofstream out("frequency.txt");
for_each(begin(wordMap), end(wordMap),
[&out](const pair<const string, int>& e)
{
out << e.first << " " << e.second << endl;
});
out.close();
return 0;
}
Основные отличия:
формирование статистики частоты слов с помощью:
for(auto &a : strings)
wordMap[a] = wordMap[a] + 1;
И .... Я бы предпочел заменить для каждого на за на основе диапазона, например:
for(const auto &e: wordMap)
out << e.first << " " << e.second << endl;
Очень мило спасибо! К сожалению, для этого назначения я не могу использовать диапазон на основе только для контейнерных функций stl.
Мне нечего добавить к ответу @ snake_style, но я хотел бы отметить, что вы можете легко отказаться от сложности / затрат, связанных с использованием copy_if для фильтрации слов в sample_doc.txt, используя простой цикл while:
#include <algorithm>
#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
#include <map>
#include <set>
using namespace std;
int main(){
set<string> exclusionSet;
ifstream stopWords("stopwords.txt");
copy(istream_iterator<string>(stopWords),
istream_iterator<string>(),
inserter(exclusionSet, exclusionSet.end()));
stopWords.close();
map<string, int> wordMap;
ifstream words("sample_doc.txt");
string s;
while(words >> s) if (exclusionSet.count(s)==0) ++wordMap[s];
ofstream out("frequency.txt");
for_each(begin(wordMap),
end(wordMap),
[&out](const pair<const string, int>& e){ out<<e.first<<" "<<e.second<<endl;});
out.close();
return 0;
}
Вы никогда ничего не вставляете в
wordMap.