Как изменить этот процесс токенизации для работы с текстовым файлом с несколькими строками? - PullRequest
1 голос
/ 28 января 2009

Я работаю с этим исходным кодом:

#include <string>
#include <vector>
#include <iostream>
#include <istream>
#include <ostream>
#include <iterator>
#include <sstream>
#include <algorithm>

int main()
{
  std::string str = "The quick brown fox";

  // construct a stream from the string
  std::stringstream strstr(str);

  // use stream iterators to copy the stream to the vector as whitespace separated strings
  std::istream_iterator<std::string> it(strstr);
  std::istream_iterator<std::string> end;
  std::vector<std::string> results(it, end);

  // send the vector to stdout.
  std::ostream_iterator<std::string> oit(std::cout);
  std::copy(results.begin(), results.end(), oit);
}

Чтобы вместо токенизации одной строки и помещения ее в вектор, он токенизирует группу строк, взятых из этого текстового файла, и помещает полученные слова в один вектор.

Text File:
Munroe states there is no particular meaning to the name and it is simply a four-letter word without a phonetic pronunciation, something he describes as "a treasured and carefully-guarded point in the space of four-character strings." The subjects of the comics themselves vary. Some are statements on life and love (some love strips are simply art with poetry), and some are mathematical or scientific in-jokes.

Пока мне ясно, что мне нужно использовать

while (getline(streamOfText, readTextLine)){} 

чтобы запустить цикл.

Но я не думаю, что это сработает:

while (getline (streamOfText, readTextLine)) { cout << readTextLine << endl; </p>

// создаем поток из строки std :: stringstream strstr (readTextLine);

// использовать потоковые итераторы для копирования потока в вектор в виде строк, разделенных пробелами std :: istream_iterator it (strstr); std :: istream_iterator end; std :: vector результаты (it, end);

/*HOw CAN I MAKE THIS INSIDE THE LOOP WITHOUT RE-DECLARING AND USING THE CONSTRUCTORS FOR THE ITERATORS AND VECTOR? */

  // send the vector to stdout.
  std::ostream_iterator<std::string> oit(std::cout);
  std::copy(results.begin(), results.end(), oit);

          }

1 Ответ

1 голос
/ 28 января 2009

Да, тогда у вас есть одна целая строка в readTextLine. Это то, что вы хотели в этом цикле? Затем вместо создания вектора из итераторов istream скопируйте в вектор и определите вектор вне цикла:

std::vector<std::string> results;
while (getline(streamOfText, readTextLine)){
    std::istringstream strstr(readTextLine);
    std::istream_iterator<std::string> it(strstr), end;
    std::copy(it, end, std::back_inserter(results));
}

На самом деле вам не нужно сначала читать строку в строку, если все, что вам нужно, это все слова из потока и никакой обработки в строке. Просто читайте из другого потока напрямую, как вы это делали в своем коде. Он будет читать не только слова из одной строки, но и из всего потока до конца файла:

std::istream_iterator<std::string> it(streamOfText), end;
std::vector<std::string> results(it, end);

Чтобы сделать все это вручную, как вы просите в комментариях, выполните

std::istream_iterator<std::string> it(streamOfText), end;
while(it != end) results.push_back(*it++);

Я рекомендую вам прочитать хорошую книгу по этому вопросу. Я думаю, он покажет вам гораздо больше полезных техник. C ++ Стандартная библиотека Джосуттиса - хорошая книга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...