2009-08-19 9 views
1

Comment puis-je lire à partir d'un std::istream en utilisant operator>>?Comment puis-je lire depuis un fichier std :: istream (using operator >>)?

J'ai essayé les éléments suivants:

void foo(const std::istream& in) { 
    std::string tmp; 
    while(in >> tmp) { 
    std::cout << tmp; 
    } 
} 

Mais il donne une erreur:

error: no match for 'operator>>' in 'in >> tmp' 
+0

le istream ne doit pas être const pour commencer. l'état de l'objet istream devra changer à la suite de l'extraction des données. –

Répondre

9

Opérateur >> modifie le flux, donc ne passez pas par const, juste une référence.

+0

Merci! Surprenant que la lecture du flux devrait le modifier, mais vraisemblablement un pointeur de position est avancé en lisant. – Frank

+2

Cela ne devrait pas être surprenant. Lire à partir d'un instream change maintenant ce que vous allez lire dans le même flux plus tard. Ceci est un effet externe observable, et doit donc être considéré pour modifier l'objet, quel que soit le détail d'implémentation interne du pointeur de position. –

1

Vous faites que la bonne façon. Êtes-vous sûr d'avoir inclus tous les en-têtes dont vous avez besoin? (<string> et <iostream>)?

+0

Oui, et sont inclus. – Frank

+0

Eugene a raison. Je n'ai pas remarqué la référence const. La raison pour laquelle il se plaint de cette erreur particulière est parce qu'il n'y a pas de version de l'opérateur >> qui prend un flux const. –

3

Utilisez une référence non-const:

void foo(std::istream& in) { 
    std::string tmp; 
    while(in >> tmp) { 
    std::cout << tmp; 
    } 
}