3 votes

C++ comment supprimer les lignes vides à la fin de l'entrée?

J'ai un exercice à faire où je dois créer un filtre qui supprime les lignes vides au début et à la fin de cin. Évidemment, le début est facile mais je suis bloqué sur la fin. Je voulais utiliser un tableau dynamique mais ce n'est pas autorisé...

Voici le texte de l'exercice :

Dans cet exercice, développez un filtre qui supprime les lignes vides existantes au début de cin et à la fin de cin. Une ligne n'est pas vide si elle contient au moins un caractère non blanc. Si une ligne vide contient des caractères blancs, ces caractères peuvent être ignorés lors de l'écriture de cette ligne vide sur le flux de sortie standard.

Mises en garde : nous n'avons pas encore abordé les tableaux de tailles indéterminées, vous ne pouvez donc pas stocker les lignes dans un tableau, et vous n'êtes pas censé adopter l'approche Perl, où vous lisez d'abord le fichier complet, puis traitez ce que vous avez. Utiliser une variable std::string est OK, mais cette variable ne doit jamais contenir plus d'une ligne lue à partir de l'entrée standard.

Je n'ai absolument aucune idée de comment vous pouvez savoir qu'il s'agit d'une ligne vide à la fin sans savoir quelle entrée reste à venir. J'apprécierais toute aide ou astuce pour me mettre sur la bonne voie.

J'ai une deuxième question, plus petite. Il est dit fichier, mais cela signifie-t-il que cela ne doit fonctionner qu'avec un fichier d'entrée ? Pour l'instant, je ne peux le faire fonctionner qu'avec une saisie manuelle (en terminant l'entrée par une combinaison spéciale de caractères) ou en recherchant simplement une nouvelle ligne (ce qui ne fonctionne qu'avec des fichiers). Existe-t-il un moyen de terminer la numérisation de la même manière dans les deux scénarios ? (Je n'utilise qu'une boucle while pour le moment)

Et pendant que nous y sommes, je suis un peu confus par le libellé. Les lignes contenant uniquement des caractères blancs doivent-elles être imprimées ou considérées comme une ligne vide et ignorées ?

Merci d'avance !

4voto

Angew Points 53063

Étant donné qu'il s'agit de devoirs, je conseillerai sur l'algorithme mais ne fournirai pas de code (ce qui enlèverait le but de l'exercice).

Les lignes vides au début et à la fin doivent être supprimées, mais les lignes vides au milieu doivent être conservées. Vous ne pouvez mettre en cache qu'une ligne de saisie. Pensez-y : avez-vous besoin de mettre en cache une ligne vide pour l'imprimer ? Ou pouvez-vous imprimer une telle ligne (ou plusieurs de ces lignes) sans les mettre en cache ? Et que suit nécessairement un bloc d'une ou plusieurs lignes vides ?

Si ces indices ne vous suffisent pas, voici l'algorithme :

Lire de cin une ligne à la fois. Si ce n'est pas vide, l'imprimer. Si c'est vide, se rappeler que vous avez rencontré une ligne vide. Continuer à lire, et tant que les lignes successives sont vides, incrémenter le compteur de lignes vides. À la fin, vous rencontrerez soit une ligne non vide, soit fin de fichier (EOF). Si EOF, simplement terminer. Si une ligne non vide, afficher counter lignes vides, et réinitialiser counter.


En ce qui concerne l'autre question : C++ abstrait les fichiers comme des flux d'entrée (ou de sortie). Un flux se termine en atteignant la EOF (fin de fichier). std::cin est juste un flux spécifique (hérité de std::istream), tout comme std::ifstream. Vous ne savez jamais non plus si std::cin provient du clavier ou d'un fichier (en utilisant par exemple une redirection shell), et cela ne devrait pas vous importuner. Écrivez simplement votre code en fonction de l'interface de flux. Notez qu'il est possible d'envoyer une EOF également sur une entrée interactive ; sous Linux par exemple, cela se fait en appuyant sur Ctrl+D.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X