Publi

  • Control-D para terminar la entrada estándar (EOF stdin)

    A veces, con muchos comandos, por ejemplo sort, tail, cat, read, o muchos otros programas que leen datos de un fichero que luego procesan, tenemos la necesidad de utilizarlos con la entrada estándar del sistema, ya sea para hacer una prueba rápida, evitar tener que escribir un fichero o cualquier otra cosa.

    Pero podemos estar introduciendo texto para esos comandos de forma indefinida:

    $sort
    estrella
    mar
    troglodita
    alienígena
    carpa
    kiosko
    gatillo

    ¿La forma de dejar de introducir texto?… Leer artículo completo

  • Ejecutar una orden externa redirigiendo STDIN [C]

    Cuando lo hacemos desde la línea de comando, es muy fácil:

    echo -e “david\njose\nalfredo\nzacarias\npatrick\ngaspar” | sort

    Pero a la hora de querer hacer un programa que ejecute la orden sort, pasándole una serie de líneas no es tan intuitivo.

    Para ello, he construido una tubería, y para ello hacemos que el descriptor STDIN_FILENO sea input[0] es decir, el descriptor de lectura de la pipe (con dup2).
    Luego pasamos las líneas que necesitemos a la pipe a través del descriptor input[1] y lo cerramos para dar por finalizada la entrada de datos.… Leer artículo completo

  • Limpiar el buffer de teclado en Linux con ejemplos en C y C++

    reducida

    A veces, mientras se está desarrollando un pequeño programa en C en el que hay entradas del usuario por teclado, hay veces que parece que se pulsan teclas solas, esto es debido a una entrada de teclado anterior que no ha llegado a volcarse entera en nuestras variables.
    Un ejemplo en cuestión lo tenéis aquí:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdlib.h>
    #include <stdio.h>

    #define MAX_NOMBRE 128

    int main(int argc, char *argv[])
    {
      char nombre[MAX_NOMBRE];
      int dia, mes, year;

      printf ("Introduce fecha de finalización (dd/mm/YYYY): ");
      scanf("%d/%d/%d", &dia, &mes, &year);
      printf ("Nombre de la tarea: ");
      fgets(nombre, MAX_NOMBRE, stdin);

      printf("La tarea %s termina el: %d/%d/%d\n", nombre, dia, mes, year);
      return EXIT_SUCCESS;
    }

    En un primer momento, cuando introducimos la fecha, tenemos que introducir “12/12/2010” por ejemplo y luego pulsar enter para que scanf() pueda finalizar, aunque esa pulsación de enter se queda almacenada en el buffer de teclado, siendo lo único que hay en el buffer en este momento.… Leer artículo completo