Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <sstream>
- #include <fstream>
- #include <string>
- #include <vector>
- #include <map>
- #include <iomanip>
- #include <algorithm>
- using namespace std;
- bool check_valid_word(string word)
- {
- string trash{"!?;,:.)\"'"};
- for ( string::iterator i = word.begin() ; i < word.end() ; i++ )
- {
- if ( ( i > word.begin() ) && (*i == '-' && *(i-1) == '-') )
- {
- return false;
- }
- else
- for ( char c : trash )
- {
- if ( c == *i )
- {
- return false;
- }
- }
- }
- if ( word.length() < 3 )
- {
- return false;
- }
- return true;
- }
- string clean_word(string word)
- {
- string trash{"!?;,:.)\"'"};
- for ( string::iterator i = word.begin() ; i < word.end() ; i++ )
- {
- if ( (i+1) == word.end() )
- {
- if ( (*i == 's' ) && ( *(i-1) == '\'' ) )
- {
- word.erase(i);
- i = i - 1;
- }
- else
- {
- for ( char c : trash )
- {
- if ( *i == c )
- {
- word.erase(i);
- i = i - 1;
- }
- }
- }
- }
- else if ( ( i == word.begin() ) && ( *i == '"' || *i == '(' ) )
- {
- word.erase(i);
- i = i - 1;
- }
- }
- return word;
- }
- vector<string> ss_to_vector(stringstream& ss)
- {
- string word;
- vector<string> wordholder;
- while ( ss >> word )
- {
- word = clean_word(word);
- if ( check_valid_word(word) )
- {
- wordholder.push_back(word);
- }
- }
- return wordholder;
- }
- map<string,int> vector_to_map(vector<string> wordholder)
- {
- string tmp;
- map<string,int> wordmap;
- for ( vector<string>::iterator iter = wordholder.begin() ; iter < wordholder.end() ; iter++ )
- {
- tmp = *iter;
- transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
- wordmap[tmp] += 1;
- }
- return wordmap;
- }
- void sort_map(map<string, int> wordmap)
- {
- //Sorts map by value and prints the new sorted map
- vector<pair<string, int>> sorted_map {wordmap.begin(), wordmap.end()};
- auto sort_lambda = [] (pair<string, int> pair1, pair<string, int> pair2) {return pair1.second > pair2.second;};
- sort(sorted_map.begin(), sorted_map.end(), sort_lambda);
- for (pair<string, int> pair_ : sorted_map)
- {
- cout << setw(25) << pair_.first << " : " << pair_.second << endl;
- }
- }
- void print_file(vector<string> words)
- {
- //Prints correct words from file with a line length of 40
- int curr_linelen{0};
- string out_str;
- auto out_lambda = [&out_str, &curr_linelen](string word)
- {
- if (word.length() + curr_linelen > 40)
- {
- out_str += ('\n' + word + " ");
- curr_linelen = word.length() + 1;
- }
- else
- {
- out_str += (word + " ");
- curr_linelen += word.length() + 1;
- }
- };
- for_each(words.begin(), words.end(), out_lambda);
- cout << out_str << endl;
- }
- void print_map(map<string,int> wordmap)
- {
- for (map<string,int>::iterator iter = wordmap.begin() ; iter != wordmap.end() ; iter++ )
- {
- cout << setw(25) << iter->first << " : " << iter->second << endl;
- }
- }
- int main()
- {
- ifstream wordfile;
- string filename;
- string line;
- stringstream ss;
- vector<string> wordholder;
- map<string,int> wordmap;
- while ( !(wordfile.is_open()) )
- {
- cout << "Mata in korrekt filnamn: ";
- cin >> filename;
- wordfile.open(filename);
- }
- while( getline( wordfile, line) )
- {
- ss << line;
- }
- wordholder = ss_to_vector(ss);
- wordmap = vector_to_map(wordholder);
- print_map(wordmap);
- sort_map(wordmap);
- print_file(wordholder);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement