c - limpiar - libreria para fflush stdin
Leyendo de stdin (2)
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
Parámetros de entrada:
int fd
descriptor de archivo es un entero y no un puntero de archivo. El descriptor de archivo parastdin
es0
void *buf
puntero a búfer para almacenar caracteres leídos por la función deread
size_t count
número máximo de caracteres para leer
Para que puedas leer personaje por personaje con el siguiente código:
char buf[1];
while(read(0, buf, sizeof(buf))>0) {
// read() here read from stdin charachter by character
// the buf[0] contains the character got by read()
....
}
¿Cuáles son las formas posibles de leer la entrada de usuario utilizando la llamada al sistema read()
en Unix? ¿Cómo podemos leer de stdin byte a byte usando read()
?
Puedes hacer algo como esto para leer 10 bytes:
char buffer[10];
read(STDIN_FILENO, buffer, 10);
recuerda que read() no agrega ''/0''
para terminar y hacer que sea una cadena (solo da un búfer en bruto).
Para leer 1 byte a la vez:
char ch;
while(read(STDIN_FILENO, &ch, 1) > 0)
{
//do stuff
}
y no olvide #include <unistd.h>
, STDIN_FILENO
definido como macro en este archivo.
Hay tres descriptores de archivo POSIX estándar, correspondientes a las tres secuencias estándar, que presumiblemente todos los procesos deberían esperar tener:
Integer value Name
0 Standard input (stdin)
1 Standard output (stdout)
2 Standard error (stderr)
Así que en lugar de STDIN_FILENO
puedes usar 0.
Editar:
En el sistema Linux puede encontrar esto usando el siguiente comando:
$ sudo grep ''STDIN_FILENO'' /usr/include/* -R | grep ''define''
/usr/include/unistd.h:#define STDIN_FILENO 0 /* Standard input. */
Note el comentario /* Standard input. */
/* Standard input. */