Comment modifier ce processus de création de jetons pour qu'il fonctionne sur un fichier texte comportant plusieurs lignes?

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

  •  20-08-2019
  •  | 
  •  

Question

Je travaille sur ce code source:

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

To, au lieu de marquer une seule ligne et de la placer dans les résultats vectoriels, il tokenise un groupe de lignes extraites de ce fichier texte et place les mots obtenus dans un seul vecteur.

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.

Jusqu'à présent, je ne fais que préciser que je dois utiliser un

while (getline(streamOfText, readTextLine)){} 

pour faire fonctionner la boucle.

Mais je ne pense pas que cela fonctionnerait:

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

// construit un flux à partir de la chaîne   std :: stringstream strstr (readTextLine);

// utilise les itérateurs de flux pour copier le flux dans le vecteur sous forme de chaînes séparées par des espaces   std :: istream_iterator it (strstr);   std :: istream_iterator end;   std :: vector résultats (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);

          }
Était-ce utile?

La solution

Oui, alors vous avez une ligne entière dans readTextLine. Est-ce que c'est ce que tu voulais dans cette boucle? Ensuite, au lieu de construire le vecteur à partir des itérateurs istream, copiez-le dans le vecteur et définissez-le en dehors de la boucle:

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

En fait, vous n’avez pas besoin de lire une ligne dans la chaîne d’abord, si vous avez seulement besoin de tous les mots d’un flux et de l’absence de traitement par ligne. Il suffit de lire directement dans l’autre flux comme vous l’avez fait dans votre code. Il ne lira pas les mots d’une seule ligne, mais de l’ensemble du flux, jusqu’à la fin du fichier:

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

Pour faire tout cela manuellement, comme vous le demandez dans les commentaires, faites

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

Je vous recommande de lire un bon livre à ce sujet. Je pense que cela vous montrera des techniques beaucoup plus utiles. La bibliothèque standard C ++ de Josuttis est un bon livre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top