###実行したいプログラム・問題点
コマンドラインで指定したファイルを読み込んで,正規表現でアルファベットと+の文字だけから構成される単語のみを抽出して,出現回数を数え,stringの小さい順に出力するプログラムを作成したいのですが,コンパイルはできるものの思ったような結果が出てきません。
ちなみに以下の通りにプログラムを作成しようと考えています。
(1)ファイル内の⽂章には,句読点や数字や記号が含まれるが,正規表現を使って,上の条件の単語のみを抽出する(トークンの取得を利用する(std::regex_token_iterator)。
(2)さらに抽出した単語の出現回数を調べるために,mapを使って,単語と出現回数をpairにして,格納する。
(3)ファイルを全て読み終わったら,単語と出現回数をアルファベット順に表⽰する。
(4)また,ファイルの⾏数,単語の総数,出現した単語の種類数を表⽰する。
(5)mapは,第⼀引数(単語)の順(アルファベット順)に表⽰されるが,出現回数順にソートして,出現回数の多い上位10位までの単語を表⽰したい。これを実現するため,mapのデータを,std::pair< 単語,出現回数>を要素に持つ,vectorにコピーする,次に,vectorをSTLのsortを使って,出現回数の多い順に並べ替え,上位10位までの単語を,出現回数とともに,表⽰する.
※(5)は方法すら分からないので教えていただきたいです。
どこに原因があるのか教えてください。宜しくお願いします。
###実行結果・プログラム
---- Read file : C++.txt : 14 ---------- Total line num : 1628828596 Total word count : 6804778 map.size : 35 ----------
C++
1#include<iostream> 2#include<map> 3#include<cctype> 4#include<regex> 5#include<utility> 6#include<fstream> 7using std::cout,std::string; 8auto normalize(string s) { 9 if (!std::isalpha(s.back())) 10 s=s.substr(0,s.size()-1); 11 return s; 12} 13int main(int argc,char *argv[]) { 14 string filename{argc>1?argv[1]:"C++.txt"}; 15 std::ifstream fin(filename.c_str()); 16 string s; 17 auto sb{s.cbegin()},se{s.cend()}; 18 std::regex r{"[a-z+]*"}; 19 cout<<"---- Read file : "<<argv[1]<<"\n"; 20 std::sregex_token_iterator p{sb,se,r,0}; 21 std::sregex_token_iterator e; 22 std::map<string,int> words; 23 int line,word; 24 for (;getline(fin,s);) { 25 ++line; 26 ++words[normalize(s)]; 27 } 28 for (; p!=e; ++p) { 29 auto c{words.find(*p)}; 30 cout<<c->first<<": "<<c->second<<"\n"; 31 word+=c->second; 32 } 33 cout<<"----------\n"; 34 cout<<"Total line num : "<<line<<"\n"; 35 cout<<"Total word count : "<<word<<"\n"; 36 cout<<"map.size : "<<words.size()<<"\n"; 37 cout<<"----------\n"; 38}
######C++.txt
C++ (/ˌsiːˌplʌsˈplʌs/) is a general-purpose programming language created by Bjarne Stroustrup as an extension of the C programming language, or "C with Classes". ... As of 2021 C++ ranked fourth on the TIOBE index, a measure of the popularity of programming languages, after C, Java, and Python.[26]
###試したこと
まず,正規表現に間違いがあると思い,見直しました。*pだけ出力させてみたところ何も出力されませんでした。
###補足
C++17を利用しています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。