Comment chercher en stdin

Bonjour les gars, j’ai besoin d’aide. Je veux lire stdin par 16 octets. Chaque octet que je convertis en forme hexadécimale. Existe-t-il un moyen d’utiliser la fonction read() pour lire NOT depuis le début, mais par exemple depuis le deuxième octet? Aussi, comment puis-je savoir si j’ai lu tout le stdin ? – De cette façon, je pourrais appeler cette fonction dans un cycle jusqu’à ce que j’ai lu tout le stdin

C’est une fonction que j’ai créée:

 void getHexLine() { int n = 16; char buffer[n]; read(STDIN_FILENO, buffer, n); buffer[n]='\0'; //printf("%08x", 0); hex number of first byte on line - not working yet putchar(' '); putchar(' '); //converting every byte into hexadecimal for (int i = 0;i < 16;i++ ) { printf("%x", buffer[i]); putchar(' '); if (i == 7 || i == 15) putchar(' '); } printf("|%s|\n", buffer); } 

La sortie devrait être comme ceci mais avec une option pour commencer à partir du deuxième octet par exemple.

 [vcurda@localhost proj1]$ echo "Hello, world! This is my program." | ./proj1 48 65 6c 6c 6f 2c 20 77 6f 72 6c 64 21 20 54 68 |Hello, world! Th| 69 73 20 69 73 20 6d 79 20 70 72 6f 67 72 61 6d |is is my program| 

Ceci est un projet d’école donc je ne peux pas utiliser malloc , scanf et . Je serais vraiment heureux si je reçois de l’aide et désolé pour mon anglais pas très compréhensible.

Existe-t-il un moyen d’utiliser la fonction read () pour lire NOT depuis le début, mais par exemple depuis le deuxième octet?

Plus généralement, vous pouvez simplement ignorer les octets de lecture qui ne vous intéressent pas.

Parfois, vous pourrez lseek , par exemple si vous exécutez votre programme avec un fichier standard défini sur son STDIN comme dans:

 ./a.out < /etc/passwd 

mais lseek échouera sur les STDIN qui sont des terminaux, des tuyaux, des périphériques de caractères ou des sockets.

comment puis-je savoir si j'ai lu le stdin entier?

read retournera 0 à la fin du fichier.


Consultez les pages de manuel pour plus d'informations. En règle générale, vous devriez vérifier vos codes de retour et votre compte pour les lectures courtes. Votre fonction devrait probablement renvoyer un int pour pouvoir communiquer une éventuelle erreur d'entrée-sortie.

stdin n’est pas recherchée. Vous pouvez lire des octets, mais vous ne pouvez pas revenir en arrière ou avancer rapidement. EOF (-1) signifie la fin de la saisie en stdin comme dans un fichier normal, mais le concept est un peu plus vague si vous menez un dialog interactif avec l’utilisateur.

Fondamentalement, stdin est orienté ligne, et il est préférable d’utiliser l’invite de motif printf (), de saisir la ligne entière de l’utilisateur, les résultats de printf () le cas échéant, et une autre invite, de lire toute la ligne de l’utilisateur, et ainsi de suite, au moins jusqu’à ce que vous vous habituez à programmer stdin.

Commencer à partir du deuxième octet devient alors facile. Lire toute la ligne, puis commencer à partir de i = 1 au lieu de i = 0 au fur et à mesure de l’parsing.