[c/c++] lire des lignes en boucle jusqu'a EOF

lire des lignes en boucle jusqu'a EOF [c/c++] - C - Programmation

Marsh Posté le 15-02-2007 à 00:15:16    

Bonjour a tous!
 
Ma question est à propos du language C en particulier. (sur LINUX)
 
Je dois lire a partir de stdin un nombre n de ligne contenant des chaines de caracteres peu importe leur taille. (en fait les ligne ne doivent pas dépasser 128 caracteres individuellement)
 
Et je dois crée une unique chaine de caracteres a partir de tout ces lignes  
 
Je doit donc concatener chaque ligne en un seul char *
 
La condition de sortie de la boucle doit être EOF (sous linux je crois que cest ctrl-d pour le stdin)
 
c-a-d que si j'entre a l'écran:
 
aaa bbb ccc<enter>
ddd eee fff ggg<enter>
hhh ^D
 
ma chaine devra contenir:
 
[aaa bbb ccc ddd eee fff ggg hhh ]
 
(avec un espace entre le dernier char* et le prochain char* même s'il ny en avais pas en d'entré.)
 
J'aimerais donc savoir les solutions possibles.
 
C'est surtout le while(..... != EOF) qui me pose un probleme en fait
je ne sais pas quelle méthode utiliser. (je sais que sa peut se faire avec feof() mais cette méthode n'est vrai qu' APRES avoir rencontré EOF donc j'aurais 2 conditions a faire et sa m'embête.
 
Si quelqu'un pouvais me diriger vers une autre alternative qui fonctionnerais avec mon probleme precis sans utiliser foef() je lui en serais tres reconnaissante.
 
Merci.

Reply

Marsh Posté le 15-02-2007 à 00:15:16   

Reply

Marsh Posté le 15-02-2007 à 01:19:39    

c'est quoi c/c++ ?

Reply

Marsh Posté le 15-02-2007 à 14:35:04    

while (fgets(...))

Reply

Marsh Posté le 15-02-2007 à 15:44:44    

Même si cet usage est correct, il faut en revenir. Si la longueur de la ligne est supérieur à la taille du buffer, ça va fonctionner, mais ça va tromper le  logiciel. Bref, il est bon d'utiliser des choses comme getline si on a ça à disposition sur sa plateforme. Voire un bout de code de la bibliothèque d'ED.

Reply

Marsh Posté le 15-02-2007 à 21:56:10    

tu lis te données successivement avec un fgets (Cf. matafan plus haut).
Tu vérifie en fin de ligne la présence ou non de l'espace, (dernier caratere de la chaine test[] --> test[strlen-1]) et si y'a a pas tu l'ajoute (strcat) avec la chaine qui suis...

Reply

Marsh Posté le 16-02-2007 à 00:38:12    

...

Reply

Marsh Posté le 16-02-2007 à 08:15:49    

lol
 
http://www.cppreference.com/stdio/getc.html
 
Tu as le droit de tout traiter comme une simple suite de caractères, ou on t'impose de vraiment lire ligne par ligne ?
 
Parce que ton énoncé est pas super clair, tu dis que tu dois lire un nombre n de lignes (facile), puis concatener chaque ligne dans une seule chaîne en remplaçant les '\0' par des ' ', mais sans préciser si oui ou non on doit déterminer chaque ligne au passage [:aloy]
 
Il est plutôt sympa ton prof, ou bof ? :whistle:

Reply

Marsh Posté le 16-02-2007 à 16:55:14    

Il faut aussi d'occuper de la longueur de la chaîne recevante, la gérer à coup de realloc.
A mon avis, fgetc est plus facile d'utilisation dans son cas, car il n'y a qu'à détecter le '\n' pour le transformer en espace sans s'occuper de savoir si le buffer de lecture est assez grand ou pas.

Reply

Marsh Posté le 17-02-2007 à 01:34:03    

Pour la chaîne qui récupère, un comptage global au début + 1 malloc peut suffire, par contre s'il faut vraiment y aller ligne par ligne effectivement realloc s'impose.
 
PS : c'est '\n', et pas '\0' comme je l'ai marqué...

Reply

Marsh Posté le 17-02-2007 à 02:09:12    

ou alors tu peux arrêter le NIH

Reply

Marsh Posté le 17-02-2007 à 02:09:12   

Reply

Marsh Posté le 17-02-2007 à 02:17:34    

Celui des Monty Pythons ?
 
 :sweat:

Reply

Marsh Posté le 17-02-2007 à 08:52:59    

Tout  dépend où en est le P.O. dans son apprentissage de la programmation et le langage utilisé, C ou C++.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed