11
votes

Skip Lines dans STD :: Istream

J'utilise std :: getline () pour lire des lignes d'une classe dérivée STD :: Istream, comment puis-je avancer quelques lignes?

Dois-je juste lire et les jeter?


0 commentaires

4 Réponses :


9
votes

Oui Utilisez std :: getline sauf si vous connaissez l'emplacement des nouvelles lignes.

Si pour une raison d'étrange, vous connaissez l'emplacement de l'endroit où les nouvelles lignes apparaissent alors vous pouvez utiliser ifstream :: recherche premier.

Vous pouvez lire d'autres moyens tels que ifstream :: lire mais std :: getline est probablement la solution la plus simple et la plus claire.


2 commentaires

@Billy: En fait, votre retard m'a donné 10 reps supplémentaires depuis que j'étais déjà à Max Cap jusqu'à il y a 10 min.


MDR! Je n'ai pas encore cogné la tête dans ledit casquette.



12
votes

edit: Vous pouvez aussi utiliser std :: istream :: ignorer, voir https: // Stackoverflow .COM / A / 25012566/492336


Dois-je utiliser GetLine le nombre de lignes que je veux sauter?

Non, mais ça va probablement être la solution la plus claire à ceux qui lisent votre code. Si le nombre de lignes que vous sautez est grande, vous pouvez améliorer les performances en lisant de gros blocs et en comptant de nouvelles lignes dans chaque bloc, arrêt et repositionnez le fichier au dernier emplacement de la nouvelle ligne. Mais à moins que vous n'ayez des problèmes de performance, je voudrais simplement mettre Getline dans une boucle pour le nombre de lignes que vous souhaitez sauter.


3 commentaires

Compter les nouvelles lignes est sorta ce qu'est un getline ferait, non?


@Gman - Enregistrer les licornes: Oui, mais vous pouvez utiliser des blocs plus importants et déplacer une plus grande distance si vous savez N est grand (c'est-à-dire compter plus d'une nouvelle ligne dans un bloc tampon)


Et si je chargez tout le fichier en mémoire et d'analyser avec des expressions régulières? Le fichier est inférieur à 1 Mo.



7
votes

Pour ce que ça vaut la peine:

void skip_lines(std::istream& pStream, size_t pLines)
{
    std::string s;
    for (; pLines; --pLines)
        std::getline(pStream, s);
}


0 commentaires

18
votes

non, vous n'avez pas à utiliser GetLine

La manière la plus efficace consiste à ignorer les chaînes avec std :: istream :: ignorer < PRE> XXX

HandlereadingLineRorror n'est pas debarter mais fabriqué à la main , bien sûr. Le premier paramètre est le nombre maximum de caractères à extraire. Si c'est exactement numérique_limites :: max (), il n'y a pas de limite: Lien sur cplusplus.com: std :: istream :: ignorer

si Vous allez sauter beaucoup de lignes que vous devez certainement l'utiliser au lieu de GetLine: lorsque je devais sauter 100 000 lignes dans mon fichier, il a fallu environ une seconde dans le sens opposé à 22 secondes avec GetLine.


0 commentaires