Existe-t-il un iterator C ++ capable de parcourir un fichier ligne par ligne?

J’aimerais obtenir un iterator de style istream_iterator qui renvoie chaque ligne du fichier sous forme de chaîne plutôt que de mot. Est-ce possible?

EDIT: Ce même tour a déjà été posté par quelqu’un d’autre dans un fil précédent .

std::istream_iterator est facile à faire:

 namespace detail { class Line : std::ssortingng { friend std::istream & operator>>(std::istream & is, Line & line) { return std::getline(is, line); } }; } template void read_lines(std::istream& is, OutIt dest) { typedef std::istream_iterator InIt; std::copy(InIt(is), InIt(), dest); } int main() { std::vector v; read_lines(std::cin, std::back_inserter(v)); return 0; } 

La bibliothèque standard ne fournit pas d’iterators pour faire cela (bien que vous puissiez implémenter quelque chose comme ça par vous-même), mais vous pouvez simplement utiliser la fonction getline (pas la méthode istream) pour lire une ligne entière d’un stream d’entrée vers une chaîne C ++ .

Exemple:

 #include  #include  #include  #include  using namespace std; int main() { ifstream is("test.txt"); ssortingng str; while(getline(is, str)) { cout< 

Voici une solution. L’exemple imprime le fichier d’entrée avec @@ à la fin de chaque ligne.

 #include  #include  #include  #include  using namespace std; class line : public ssortingng {}; std::istream &operator>>(std::istream &is, line &l) { std::getline(is, l); return is; } int main() { std::ifstream inputFile("input.txt"); istream_iterator begin(inputFile); istream_iterator end; for(istream_iterator it = begin; it != end; ++it) { cout << *it << "@@\n"; } getchar(); } 

Edit: Manuel a été plus rapide.

Vous pouvez écrire votre propre iterator. Ce n’est pas si dur. Un iterator n’est qu’une classe sur laquelle (simplement) l’incrément et les opérateurs * sont définis.

Regardez http://www.drdobbs.com/cpp/184401417 pour commencer à écrire vos propres iterators.

Vous pouvez utiliser istreambuf_iterator au lieu de istream_iterator. Il n’ignore pas les caractères de contrôle comme istream_iterator.

code.cpp:

 #include  #include  #include  using namespace std; int main() { ifstream file("input.txt"); istreambuf_iterator i_file(file); istreambuf_iterator eof; std::ssortingng buffer; while(i_file != eof) { buffer += *i_file; if(*i_file == '\n') { std::cout << buffer; buffer.clear(); } ++i_file; } return 0; } 

input.txt:

 ahhhh test *<-- There is a line feed here* bhhhh second test *<-- There is a line feed here* 

sortie:

 ahhhh test bhhhh second test