Lire de la conduite de ligne en ligne dans C
Comment puis-je séparer les lignes qui sont à venir à partir d'un tuyau. Dans le tube il y a ce texte:
HALLO:500\n
TEST:300\N
ADAD
ADAWFFA
AFAGAGAEG
Je veux séparer les lignes de la pipe parce que je veux enregistrer les valeurs dans des variables.
Voici mon code c:
#include <stdio.h>
#include <stdlib.h>
#define BUFFERSIZE 1
int main(int argc, char **argv){
unsigned char buffer[BUFFERSIZE];
FILE *instream;
int bytes_read=0;
int buffer_size=0;
buffer_size=sizeof(unsigned char)*BUFFERSIZE;
/* open stdin for reading */
instream=fopen("/dev/stdin","r");
/* did it open? */
if(instream!=NULL){
/* read from stdin until it's end */
while((bytes_read=fread(&buffer, buffer_size, 1, instream))==buffer_size){
fprintf(stdout, "%c", buffer[0]);
}
}
/* if any error occured, exit with an error message */
else{
fprintf(stderr, "ERROR opening stdin. aborting.\n");
exit(1);
}
return(0);
}
Est-ce la bonne façon de lire à partir de tube pour la meilleure ligne par ligne?
for the best
est une question subjective. Vous êtes vraiment face à un problème?- Remplacer
fread
avecfgets
.
Vous devez vous connecter pour publier un commentaire.
C'est généralement appelé simplement lire stdin. Le programme ne devrait pas se préoccuper de savoir si l'entrée est une pipe, un redirigé fichier, ou un clavier.
fread vais lire seulement jusqu'à ce que le tampon est plein. Utiliser fgets pour lire une ligne.
Aussi la taille de la mémoire tampon doit être assez grand pour tenir la ligne. Pour un peu les programmes, vous pouvez choisir un nombre. Ou il y a un nom standard
BUFSIZ
qui vous donne un assez-grand tampon. De quelle taille? Assez grand. Vraiment? Probablement.fgets
copie le caractère de saut de ligne à la corde, à moins que la chaîne se remplit en premier. Ainsi, vous pouvez tester le dernier caractère à dire si la ligne a été tronqué ou non. Avec raisonnable entrées, qui ne va pas arriver. Mais une approche plus solide serait d'allouer un tampon plus grand, copie partielle de la ligne, et de les appelerfgets
nouveau tp continuer à essayer d'obtenir une ligne complète.Cela vous arrive à mi-chemin en étant protégé de la redoutable débordement de la mémoire tampon problème.
fgets
ne vais pas écrire plus de la taille du passé. L'autre moitié, comme mentionné ci-dessus, est en train de faire quelque chose de sensible, avec le possible des lignes partielles qui pourraient résulter de façon inattendue de longues lignes d'entrée.man fgets
pour vous-même. (C'est la première chose que je ferais à écrire un exemple. Je reçois toujours les arguments en arrière quand j'écris sans vérifier.)Voici une autre option (je ne suis pas totalement sûr que c'est un " bon " sens)- utiliser le nombre d'octets lus par le
read
fonction.Dans cet exemple, je lisais de
stdin
bien que la redirection a été faite afin de la fd en 0 est un fichier/pipe/tout ce que vous avez besoin qu'il soit.