2010-10-24 18 views
1

Quelle est la meilleure façon d'analyser ou de parcourir un istream? J'ai besoin de créer une fonction qui prend un istream, l'analyse et crée un objet alors je me demandais la meilleure façon de le faire. Même quelque chose qui pourrait le convertir en string serait dandy.C++ Itérer un istream

Répondre

4

Vous pouvez utiliser un istream_iterator.

typedef std::istream_iterator<std::string> streamiter; 
for (streamiter it = streamiter(some_istream); it != streamiter(); it++) { 
    // process words 
} 

Cela va diviser le flux d'entrée à tous les espaces.

+0

Vous êtes un gentleman et un érudit. – Louis

1

Étant donné que la réflexion et la persistance ne sont pas intégrées à C++, vous ne pouvez pas écrire une fonction qui lit un objet, puis affiche son objet. Vous besoin de savoir ce que vous cherchez avant main et lire cela spécifiquement. (Bien sûr, vous pouvez toujours lire les jetons et les introduire dans un analyseur syntaxique.)

Si vous savez exactement quel type d'objet lire dans le flux, il est souvent bon de donner à cette classe un constructeur prenant un std::istream&. Etant donné que la classe est généralement l'endroit où le code à écrire dans le flux est, cela les rapproche tous les deux, ce qui est préférable pour la maintenance. Le code d'analyse crée ensuite simplement l'objet qui transmet le flux au constructeur.

Si vous ne savez pas quel type vous rencontrerez, vous devrez écrire une fonction d'analyse (probablement simple). De tels formats devraient commencer par un identifiant qui indique quel type d'objet suit. Votre fonction d'analyse doit d'abord lire cet identificateur, puis se branche sur un code qui lit le type approprié dans le flux. Puisque, à ce stade, il sait quel type d'objet lire dans le flux, la lecture des objets réels peut être implémentée dans les constructeurs comme décrit ci-dessus.