1

構造が設定されていないテキストファイル(メモや小さなレポートなど)から入力を単語ごとに読み取る方法に興味があります。たとえば、テキストは次のように構成されます。

「1992/06/05
今日は良い日です
。ワームは向きを変え、戦いに勝利しました。」

getline を使用して行を取得し、そこから空白を介して単語に分割できるかどうかを考えていました。次に、 strtok を使用するとうまくいくかもしれないと思いました! ただし、句読点では機能しないと思います。

私が考えていた別の方法は、文字ごとにすべてを取得し、望ましくない文字を省略することでした。しかし、それはありそうにないようです。

簡単に言うと、ファイルから入力を読み取って単語に分割する簡単な方法はありますか?

4

4 に答える 4

3

はい。あなたが探しているのはstd::istream::operator>>:)連続した空白を削除することに注意してくださいが、ここで問題になるとは思えません。

すなわち

std::ifstream file("filename");
std::vector<std::string> words;
std::string currentWord;
while(file >> currentWord)
    words.push_back(currentWord);
于 2010-09-12T02:10:46.083 に答える
3

重複質問を探すより書いたほうが楽なので、

#include <iterator>

std::istream_iterator<std::string> word_iter( my_file_stream ), word_iter_end;

size_t wordcnt;
for ( ; word_iter != word_iter_end; ++ word_iter ) {
    std::cout << "word " << wordcnt << ": " << * word_iter << '\n';
}

へのstd::string引数は、 を実行したときにistream_iteratora を返すように指示します。イテレータがインクリメントされるたびに、ストリームから別の単語を取得します。string*word_iter

同時に同じストリームに複数の反復子がある場合は、抽出するデータ型を選択できます。ただし、その場合は>>直接使用する方が簡単な場合があります。イテレータの利点は、 の汎用関数にプラグインできること<algorithm>です。

于 2010-09-12T02:11:30.747 に答える
0

スペース文字で getline を使用できます。getline(buffer,1000,' ');

または、この関数を使用して、特定の区切り文字を使用して文字列をいくつかの部分に分割することもできます。

string StrPart(string s, char sep, int i) {
  string out="";
  int n=0, c=0;
  for (c=0;c<(int)s.length();c++) {
    if (s[c]==sep) {
      n+=1;
    } else {
      if (n==i) out+=s[c];
    }
  }
  return out;
}

注: この関数は、宣言されていることを前提としていますusing namespace std;

s分割する文字列です。 sep区切り文字 iは取得する部分(0ベース)です。

于 2010-09-12T02:11:20.667 に答える
0

スキャナー技術を使用して、単語、数字、日付などを取得できます...非常にシンプルで柔軟です。スキャナは通常、トークン (単語、数値、実数、キーワードなど) をパーサーに返します。

後で単語を解釈する場合は、このアプローチをお勧めします。

Ronald Mak (Wiley Computer Publishing) の本「Writing Compilers and Interpreters」をお勧めします。

于 2010-09-12T02:56:28.447 に答える