Como faço para alterar este processo tokenization para trabalhar em um arquivo de texto com várias linhas?

StackOverflow https://stackoverflow.com/questions/485371

  •  20-08-2019
  •  | 
  •  

Pergunta

Eu estou trabalhando este código-fonte:

#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);
}

Para, em vez de tokenizing uma única linha e colocá-lo em resultados vetoriais, tokenizes um grupo de linhas tiradas a partir deste arquivo de texto e coloca as palavras resultantes em um único vector.

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.

Até agora, eu só estou claro que eu preciso usar um

while (getline(streamOfText, readTextLine)){} 

para obter o ciclo de execução.

Mas eu não acho que isso iria funcionar:

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

// construir um fluxo a partir da cadeia std :: stringstream strstr (readTextLine);

// iterators fluxo uso para copiar o fluxo para o vector como espaços em branco separados cordas std :: istream_iterator-lo (strstr); std :: final istream_iterator; resultados std :: vector (isto, final);

/*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);

          }
Foi útil?

Solução

Sim, então você tem uma linha inteira em readTextLine. É isso que você queria nesse loop? Então, em vez de construir o vetor das iterators istream, copie para o vector, e definir o vector fora do loop:

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));
}

Você realmente não precisa ler uma linha na cadeia de primeira, se tudo que você precisa é que todas as palavras de um riacho, e nenhum processamento per-line. Basta ler a partir do outro fluxo diretamente como você fez em seu código. Ele não só irá ler palavras de uma linha, mas de todo o fluxo, até o final de arquivo-:

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

Para fazer tudo isso manualmente, como você pedir nos comentários, faça

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

Eu recomendo que você leia um bom livro sobre isso. Ela vai mostrar muito mais útil técnicas penso. C ++ biblioteca padrão por Josuttis é um bom livro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top