2009-11-13 2 views
1

Devrait-il y avoir une raison de préférer getline ou istream_iterator si vous faites une ligne par ligne depuis un fichier (en lisant la ligne dans une chaîne, pour la tokenisation).getline vs istream_iterator

+2

Vous avez genre de répondu à la question vous - utilisez 'getline' pour obtenir une ligne, ou 'istream_iterator' pour la tokenisation. –

Répondre

11

Je parfois (en fonction de la situation) écrire une classe de ligne donc je peux utiliser istream_iterator:

#include <string> 
#include <vector> 
#include <iterator> 
#include <iostream> 
#include <algorithm> 

struct Line 
{ 
    std::string lineData; 

    operator std::string() const 
    { 
     return lineData; 
    } 
}; 
std::istream& operator>>(std::istream& str,Line& data) 
{ 
    std::getline(str,data.lineData); 
    return str; 
} 

int main() 
{ 
    std::vector<std::string> lines; 
    std::copy(std::istream_iterator<Line>(std::cin), 
       std::istream_iterator<Line>(), 
       std::back_inserter(lines) 
      ); 
} 
6

getline vous obtiendrez la ligne entière, tandis que istream_iterator<std::string> vous donnera des mots individuels (séparés par des espaces). Cela dépend de ce que vous essayez d'accomplir, si vous demandez ce qui est le mieux (la segmentation est juste un bit, par exemple si vous attendez un programme bien formé et que vous vous attendez à l'interpréter, il vaut peut-être mieux lire lignes entières ...)

+0

Désolé j'aurais dû ajouter que la ligne est séparée par des virgules. donc istream_iterator irait chercher la ligne entière. – Pradyot

+0

Si vous ne vous attendez pas à ce que l'entrée soit malformée _EVER_, ce qui est difficile à dire, oui, vous obtiendrez une ligne entière. – dirkgently

+0

Chaque cellule d'une ligne ne doit pas non plus contenir d'espaces. –

Questions connexes