2016-08-20 11 views
0

私はファイルを読み込んでその内容を文字列の中に格納しました。今、私はファイルに含まれているユニークな単語の数を探したい。文字列イテレータがend()を見つけることができません

私は

map< string , int > wordCount; 

を作成し、文字列内のファイルの内容を入れて、彼は

void wordCounter(){ 
     string content; 
     file.seekg(0, ios::end); 
     content.resize(file.tellg()); 
     file.seekg(0, ios::beg); 
     file.read(&content[0] , content.size()); 
     ostringstream os; 
     for(string::iterator current , next = content.begin() ; current != content.end() || next != content.end();){ 
      if(*next == ' ' || *next == '\r\n'){ 
       wordCount[ os.str() ]++; 

       while(next != content.begin() && (*next == ' ' || *next ==' \r\n')){ 
        next++; 
       } 
       os.str(" "); 
       current = next; 
      }else{ 
       if(*next <= 'Z' && *next >='A') 
        os << char(*next - ('Z'-'z')); 
       else 
        os << (*next); 
       next++; 
      } 
     } 
    } 

をマップしかし、これは無限ループにつながるに追加機能を作成しました。 itratorは文字列のend()を見つけることができないようです。なぜこのようなことが起こっているのですか?私は合理的な答えを見つけることができません。ありがとう

+0

mao?あなたは地図ですか? – jonathanGB

+0

oh、typo、thanksありがとうございます – Abdir

+3

その全体的な操作は過度に複雑に思えます。 'string word; while(ファイル>>単語){wordCount [単語] ++; } 'は、ファイル内の単語の出現を数えます。ただし、句読点を無視したい場合はもう少し作業が必要です。 –

答えて

1

示されたコードには複数のバグがあります。

for(string::iterator current , next = content.begin() ; 
    current != content.end() || next != content.end();) 

これはcurrentnextを宣言します。 nextcontent.begin()に初期化されます。 currentが初期化されていない場合は、値と比較されます。これは未定義の動作です。

if(*next == ' ' || *next == '\r\n'){ 

*nextは、1文字です。 1文字と2文字を比較すると、実現するはずのものは決してうまくいきません。'\r\n'

+0

'||'で2つの否定された条件に参加することも疑わしいです、 'while(next!= content.begin () '。 – melpomene

+0

私は窓に集中していたので、1文字だけ比較しているのを忘れていましたが、現在の宣言を省略しても機能しますが、ファイル内の最後の単語は省略します – Abdir

+0

実際に\ r \ n "は2文字ではなく、マルチ文字リテラルで、タイプはint [lex.ccon]/1ですが、比較は実際には偽です。 –

関連する問題