2016-09-20 8 views
0

したがって、いくつかのテキストファイルがあります。ファイル内で最もよく使われる10の文字と単語を調べる必要があります。私はベクトルを使用することを決め、ファイルから各文字をロードしました。ただし、空白と改行を含める必要があります。テキストファイルの内容を空白または改行をスキップせずにベクトルに読み込みます。

これは私の現在の機能

void readText(ifstream& in1, vector<char> & list, int & spaces, int & words) 
{ 
//Fills the list vector with each individual character from the text ifle 
in1.open("test1"); 

in1.seekg(0, ios::beg); 
std::streampos fileSize = in1.tellg(); 
list.resize(fileSize); 

    string temp; 
    char ch; 
    while (in1.get(ch)) 
    { 
     //calculates words 
     switch(ch) 
     { 
     case ' ': 
      spaces++; 
      words++; 
      break; 
     default: 
      break; 
     } 
     list.push_back(ch); 
    } 
    in1.close(); 
} 

ですが、何らかの理由で、適切に文字のすべてを保持していないようです。私は、256のintがすべて0に設定されているプログラムの別の場所に別のベクトルを持っています。それは、その中のテキストを持つベクトルを通り、他のベクトルの0-256のint値で文字を集計します。しかし、それはうまくそれらを集計していますが、スペースと改行は問題を引き起こしています。これを行うより効率的な方法はありますか?

答えて

4

今すぐあなたのコードの問題は、あなたが

list.resize(fileSize); 

を呼ぶと同時に、あなたの読み取りループに

list.push_back(ch); 

を使用していることです。あなたはどちらか一方しか必要としません。

いずれかを省略してください。


これを行うためのより効率的な方法はありますか?

最も簡単な方法は、あなたが既に知っているサイズでstd::vector <char>のサイズを変更し、一度にファイル全体を読み込むことstd::ifstream::read()を使用することです。その後、すべてのものをベクタの内容から計算します。これらの線に沿って
何か:

list.resize(fileSize); 
in1.read(&list[0],fileSize); 

for(auto ch : list) { 
    switch(ch) { 
     // Process the characters ... 
    } 
} 
+0

は直接、ベクターに::はifstream ::読み()プッシュ文字をはstdすることはできますか?あるいは、中間バッファーが必要ですか? – blackpen

+1

@blackpen以前はリサイズされたベクトルをバッファとして使います。 'push_back()'とは関係ありません。 –

+0

ありがとうございます。どのようにファイルをベクトルに送るためにreadを使うのですか?私はまた、ランダムなサイズの複数のファイルを使用できるようにする必要があります –

関連する問題