4

これは、私が見つけることができるすべての例がベクトルを使用しており、教師がこのクラスでベクトルを使用することを許可しないため、答えが見つからないように見える別の質問です。


' '(任意の数の) 空白スペースと (任意の数の) 文字以外の文字を区切り文字として使用して、一度に 1 語ずつ本のプレーン テキスト版を読む必要があります。そのため、任意の量のスペースまたは句読点で単語を区切る必要があります。空白を区切り文字として使用するだけでよい場合に、私が行った方法は次のとおりです。

while(getline(inFile, line)) {
    istringstream iss(line);

    while (iss >> word) {
        table1.addItem(word);
    }
}

編集: 読み込まれたテキストの例と、それをどのように分離する必要があるか。

「彼らが知っていたら;;あなたはそれを望んでいました、娯楽.

最初の行を分離する必要がある方法は次のとおりです。

もしも

彼ら

持っていました

知られている

あなた

欲しかった

それ

エンターテイメント

だろう

持ってる

テキストには、少なくともすべての標準句読点が含まれますが、省略記号、...二重ダッシュ--なども含まれます。

いつもありがとうございます。

編集:

では、2 番目の stringstream を使用すると、次のようになりますか?

while(getline(inFile, line)) {
    istringstream iss(line);

    while (iss >> word) {
        istringstream iss2(word);

        while(iss2 >> letter)  {
            if(!isalpha(letter))
                // do something?
        }
        // do something else?
        table1.addItem(word);
    }
}
4

2 に答える 2

2

目の前に g++ コンパイラがないため、これをテストしていませんが、動作するはずです (マイナーな C++ 構文エラーは別として)。

while (getline(inFile, line))
{
    istringstream iss(line);

    while (iss >> word)
    {
        // check that word has only alpha-numeric characters
        word.erase(std::remove_if(word.begin(), word.end(), 
                                  [](char& c){return !isalnum(c);}),
                   word.end());
        if (word != "")
            table1.addItem(word);
    }
}
于 2014-11-23T23:31:38.330 に答える
1

を自由に使用Boostできる場合は、次のことができます。

$ cat kk.txt
If they had known;; you ... wished it, the entertainment.would have

必要に応じて の動作をカスタマイズできtokenizerますが、デフォルトで十分です。

#include <iostream>
#include <fstream>
#include <string>

#include <boost/tokenizer.hpp>

int main()
{
  std::ifstream is("./kk.txt");
  std::string line;

  while (std::getline(is, line)) {
    boost::tokenizer<> tokens(line);

    for (const auto& word : tokens)
      std::cout << word << '\n';
  }

  return 0;
}

そして最後に

$ ./a.out
If
they
had
known
you
wished
it
the
entertainment
would
have
于 2014-11-23T23:29:46.933 に答える