Question

Je suis sur un cours intensif C ++ personnalisé. Je connais les bases depuis de nombreuses années, mais je suis en train d'essayer de me rafraîchir la mémoire et en savoir plus. À cette fin, comme ma deuxième tâche (après avoir écrit une classe de pile basée sur des listes liées), j'écris ma propre classe de chaîne.

Il est allé assez bien jusqu'à maintenant; Je veux surcharger l'opérateur >> que je peux faire des choses comme cin >> my_string ;. Le problème est que je ne sais pas lire le istream correctement (ou peut-être le problème est que je ne sais pas ... cours d'eau). J'ai essayé un certain temps (! Stream.eof ()) boucle .Lire () de 128 octets à la fois, mais comme on pouvait s'y attendre, il arrête seulement sur EOF. Je veux lire à une nouvelle ligne, comme vous obtenez avec cin >> à un std :: string.

Ma classe de chaîne a une alloc fonction (size_t de new_size) qui (re) alloue de la mémoire, et une fonction append (de const char *) qui fait partie, mais je dois évidemment de connaître la quantité de mémoire à allouer avant de pouvoir écrire dans le tampon.

Des conseils sur la façon de mettre en œuvre ce? J'essayé d'obtenir la longueur de istream avec seekg () et tellg (), en vain (il renvoie -1), et que ladite boucle jusqu'à ce que je EOF (ne se limite pas à la lecture d'un saut de ligne) la lecture d'un morceau à la fois.

Était-ce utile?

La solution

Pour lire les caractères à partir du courant jusqu'à la fin de la ligne utiliser une boucle.

char c;
while(istr.get(c) && c != '\n')
{
     // Apped 'c' to the end of your string.
}
// If you want to put the '\n' back onto the stream
// use istr.unget(c) here
// But I think its safe to say that dropping the '\n' is fine.

Si vous manquez de place réallouer votre tampon avec une plus grande taille. Copiez les données à travers et continuer. Pas besoin d'être de fantaisie pour un projet d'apprentissage.

Autres conseils

vous pouvez utiliser cin :: getline (tampon *, buffer_size); alors vous devrez vérifier les mauvais, et ne parviennent eof drapeaux:

std :: cin.bad (), std :: cin.eof (), std :: cin.fail ()

à moins mauvais ou EOF ont été mis, drapeau ne pas être défini indique généralement dépassement de mémoire tampon, vous devez donc réallouer votre tampon et continuer à lire dans le nouveau tampon après avoir appelé std :: cin.clear ()

Une note de côté: Dans la STL l'opérateur >> d'un istream est surchargé de fournir ce type de fonctionnalité ou (comme pour * char) sont des fonctions globales. Peut-être qu'il serait plus judicieux de prévoir une surcharge personnalisée au lieu de surcharger l'opérateur dans votre classe.

Vérifier la réponse de Coffin Jerry à cette question .

La première méthode qu'il utilise est très simple (juste une classe d'aide) et vous permet d'écrire votre entrée dans un std::vector<std::string> où chaque élément du vecteur représente une ligne de l'entrée d'origine.

Cela fait vraiment les choses faciles en matière de traitement après!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top