Come posso modificare questo processo di tokenizzazione per lavorare su un file di testo con più righe?

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

  •  20-08-2019
  •  | 
  •  

Domanda

Sto lavorando a questo codice sorgente:

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

Per, invece di tokenizzare una singola riga e inserirla nei risultati del vettore, tokenizza un gruppo di righe prese da questo file di testo e inserisce le parole risultanti in un singolo vettore.

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.

Finora, mi è chiaro solo che devo usare a

while (getline(streamOfText, readTextLine)){} 

per far funzionare il ciclo.

Ma non penso che funzionerebbe:

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

Costruisci un flusso dalla stringa std::stringstream strstr(readTextLine);

Usare gli iteratori di flusso per copiare il flusso nel vettore come stringhe separate da spazi vuoti std::istream_iterator esso(strstr);std::istream_iterator fine;std::vettore risultati(it, fine);

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

          }
È stato utile?

Soluzione

Sì, allora hai un'intera riga dentro readTextLine.È questo quello che volevi in ​​quel giro?Quindi, invece di costruire il vettore dagli iteratori istream, copialo nel vettore e definisci il vettore all'esterno del ciclo:

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

In realtà non è necessario leggere prima una riga nella stringa, se tutto ciò di cui hai bisogno sono tutte le parole di uno stream e nessuna elaborazione per riga.Basta leggere direttamente dall'altro flusso come hai fatto nel tuo codice.Non leggerà solo le parole da una riga, ma dall'intero flusso, fino alla fine del file:

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

Per fare tutto ciò manualmente, come chiedi nei commenti, fallo

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

Ti consiglio di leggere un buon libro a riguardo.Ti mostrerà tecniche molto più utili, penso. Libreria standard C++ di Josuttis è un buon libro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top