Lire depuis l'entrée standard stdin écrire sur la sortie standard en C
Je suis en train d'écrire un chat clone pour l'exercice C, j'ai ce code:
#include <stdio.h>
#define BLOCK_SIZE 512
int main(int argc, const char *argv[])
{
if (argc == 1) { //copy stdin to stdout
char buffer[BLOCK_SIZE];
while(!feof(stdin)) {
size_t bytes = fread(buffer, BLOCK_SIZE, sizeof(char),stdin);
fwrite(buffer, bytes, sizeof(char),stdout);
}
}
else printf("Not implemented.\n");
return 0;
}
J'ai essayé echo "1..2..3.." | ./cat
et ./cat < garbage.txt
mais je ne vois pas de sortie sur la borne. Ce que je fais de mal ici?
Edit:
Selon les commentaires et les réponses, j'ai fini par faire ceci:
void copy_stdin2stdout()
{
char buffer[BLOCK_SIZE];
for(;;) {
size_t bytes = fread(buffer, sizeof(char),BLOCK_SIZE,stdin);
fwrite(buffer, sizeof(char), bytes, stdout);
fflush(stdout);
if (bytes < BLOCK_SIZE)
if (feof(stdin))
break;
}
}
N'utilisez pas de
ici, fread (), presque toujours, les résultats de zéro octets, sauf si vous avez tapé exactement de 512 caractères.
Comment modifier mon look?
Mieux, bien que probablement, vous voulez vérifier le nombre d'octets renvoyés avant écrit à
feof
en tant que votre condition de boucle; il ne reviendra pas vrai jusqu'à ce que après vous avez tenté de lire au-delà de la fin du fichier, de sorte que votre boucle peut exécuter une fois de trop. Vérifier le résultat de fread
au lieu de cela, et si elle est plus petite que TAILLE_BLOC, appel feof
de vérifier pour la fin-de-fichier. Et vous avez besoin d'ajouter fflush(stdout);
après la fwrite
appel.ici, fread (), presque toujours, les résultats de zéro octets, sauf si vous avez tapé exactement de 512 caractères.
Comment modifier mon look?
Mieux, bien que probablement, vous voulez vérifier le nombre d'octets renvoyés avant écrit à
stdout
. Vous pouvez inverser le sens de l'épreuve, comme if (bytes > 0) fwrite(...) else break;
; après tout, si vous obtenez 0 octets en arrière, vous pourriez aussi bien avoir frappé les expressions du FOLKLORE.OriginalL'auteur yasar | 2012-04-12
Vous devez vous connecter pour publier un commentaire.
je peux citer une réponse par moi: https://stackoverflow.com/a/296018/27800
OriginalL'auteur Peter Miehle
Votre problème semble être la valeur de retour de fread. J'ai modifié ton code pour afficher la valeur d'octets, et j'obtiens 0 à chaque fois. La page de man pour fread il est clair que la valeur de retour de fread n'est PAS le nombre de caractères. Si EOF est rencontré la valeur de retour pourrait être de zéro (ce qui est dans ce cas). C'est parce que vous tentez de lire dans 1 chose qui est de la taille TAILLE_BLOC plutôt que TAILLE_BLOC choses qui sont de la taille 1.
Ouais, j'ai lu votre réponse, juste que j'ai été poster le mien. J'ai juste ajouté un modifier pour le rendre plus clair. Votre réponse sur l'autre post peut-être un peu difficile à analyser pour quelqu'un de nouveau à la langue. J'ai également voté pour votre réponse 🙂
OriginalL'auteur natet
Essayez d'appeler
fflush(stdout)
après lafwrite()
OriginalL'auteur
Ignorer mon commentaire à propos de
fflush
; ce n'est pas la question.Inverser l'ordre de la taille des blocs et la taille de l'élément dans le
fread
appel. Vous voulez lire jusqu'à TAILLE_BLOC des éléments de taille 1 (sizeof (char)
est de 1 par définition); ce que vous avez à faire est d'essayer de lire 1 élément de taille TAILLE_BLOC, de sorte que si vous tapez dans au moins TAILLE_BLOC personnages,fread
sera de retour 0. OIE, votrefread
appel doit êtreFaire un changement similaire à la
fwrite
appel.OriginalL'auteur John Bode