Continuant de mon commentaire précédent, il y a une différence très peu entre la lecture et l'écriture à l'aide stdin
read
et write
et en utilisant des fonctions de niveau supérieur comme fgets
et printf
. La principale différence est que vous ne pouvez pas compter sur la chaîne de format fournie par le printf
variadique, et avec read
, vous êtes responsable de l'utilisation du retour pour savoir combien de caractères ont été réellement lus.
est Ci-dessous un court exemple montrant les rudiments de la lecture entrée de stdin
avec read
puis écrire cette information de retour avec write
(Note: il y a des contrôles supplémentaires que vous devez ajouter comme vérifier que le nombre de caractères lus est inférieur à la taille du tampon pour savoir si plus de caractères restent à lire, etc ...) Vous pouvez toujours mettre une grande partie de l'invite et read
dans une fonction pour faciliter l'utilisation répétitive.
Avec write
, rappelez-vous juste, l'ordre que vous écrire des choses à stdout
est la chaîne de format. Il suffit donc de faire des appels logiques à write
pour accomplir le formatage que vous désirez.Pendant que vous êtes libre d'utiliser les STDIN_FILENO
définit, vous pouvez également utiliser simplement 0 - stdin
, 1 - stdout
et 2 - stderr
:
#include <unistd.h>
#define MAXC 256
int main (void) {
char buf[MAXC] = {0};
ssize_t nchr = 0;
/* write the prompt to stdout requesting input */
write (1, "\n enter text : ", sizeof ("\n enter text : "));
/* read up to MAXC characters from stdin */
if ((nchr = read (0, buf, MAXC)) == -1) {
write (2, "error: read failure.\n", sizeof ("error: read failure.\n"));
return 1;
}
/* test if additional characters remain unread in stdin */
if (nchr == MAXC && buf[nchr - 1] != '\n')
write (2, "warning: additional chars remain unread.\n",
sizeof ("warning: additional chars remain unread.\n"));
/* write the contents of buf to stdout */
write (1, "\n text entered: ", sizeof ("\n text entered: "));
write (1, buf, nchr-1);
write (1, "\n\n", sizeof ("\n\n"));
return 0;
}
Compile
gcc -Wall -Wextra -o bin/read_write_stdin read_write_stdin.c
Sortie
$ ./bin/read_write_stdin
enter text : The quick brown fox jumps over the lazy dog!
text entered: The quick brown fox jumps over the lazy dog!
La façon la plus simple est probablement de lire un caractère à la fois unt Vous obtenez une nouvelle ligne, en ajoutant les caractères à un tableau. –
Si vous voulez lire à partir de stdin, n'auriez-vous pas besoin de spécifier la taille de la matrice avant la main? Je comprends ce que tu veux dire mais je ne sais pas comment je l'implémenterais. – user3538161
Il n'y a pas vraiment de différence entre utiliser 'read/write' pour faire des entrées/sorties et utiliser' getchar/printf'. La principale différence est que vous ne profitez pas du luxe d'une sortie formatée ou d'une fonction d'impression variée. Vous devez faire la mise en forme en écrivant chaque morceau de sortie à «stdout» comme vous le souhaitez. Si vous êtes toujours coincé, faites le moi savoir. Vous utilisez read sur 'stdin' comme n'importe quel fichier. Vous déclarez un tampon (tableau) et lisez depuis «stdin» dans le tampon. Le retour de 'read' vous donne le nombre de caractères lus avec succès. –