Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con read

Estas en el tema de Problema con read en el foro de C/C++ en Foros del Web. Parezco tonto pero no se como leer de teclado con el comando read. Tengo el siguiente codigo: Código: char buffer[256]; char buffer2[256]; read (0, buffer, ...
  #1 (permalink)  
Antiguo 21/10/2009, 15:19
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
Problema con read

Parezco tonto pero no se como leer de teclado con el comando read.

Tengo el siguiente codigo:

Código:
char buffer[256];
        char buffer2[256];

        read (0, buffer, sizeof (buffer));

        sprintf (buffer2, "%s\n", buffer);
        write (1, buffer2, strlen (buffer2));
Leo 256 bytes de teclado (file descriptor 0) y lo guardo en buffer.

Quiero mostrar el contenido por pantalla, pero me sale la palabra seguido de caracteres raros. Se que la funcion read me devuelve los bytes leidos pero no se como obtener estos bytes de la cadena buffer para posteriormente imprimirlo por pantalla sin mostrar la basura que tambien guarda...

Gracias.
  #2 (permalink)  
Antiguo 21/10/2009, 22:16
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Problema con read

Hola,

Posiblemente te sea de alguna ayuda,

Código C:
Ver original
  1. // _ssize_t r = read(STDIN_FILENO, buffer, sizeof(buffer) - 1)
  2. // buffer[r] = NULL;
  3.     buffer[read(STDIN_FILENO, buffer, sizeof(buffer) - 1)] = NULL;
  4.     printf ("%s\n", buffer);
Pero read() puede regresar un valor negativo para informar de error.

Saludos,

Última edición por HackmanC; 21/10/2009 a las 22:23 Razón: error
  #3 (permalink)  
Antiguo 22/10/2009, 10:13
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
Respuesta: Problema con read

Tu codigo me da error pero me aclaraste sin querer el problema.

Cuando se utiliza el read lee bytes y los guarda en el buffer. No es como el scanf que automaticamente le mete un '\0' al final de la cadena. El read no lo hace por lo que debes ponerselo tu de la siguiente forma:

Quien deba usar las funciones read y write para leer de teclado y escribir por pantalla aqui tiene un ejemplo:

Código:
void out (char* str){
        write (1, str, strlen (str));
}

void in (char* str){
        char buffer[MAX_CHAR];
        int bytes = read (0, buffer, sizeof (buffer));

        if (bytes != -1){
                buffer[bytes - 1] = '\0';
                strcpy (str, buffer);
        }else{
                out ("\n\nError de lectura.\n\n");
        }
}

int main (){
        char buffer[MAX_CHAR];
        char str[MAX_CHAR];
        int n;

        out ("Introduce cadena: ");
        in (str);

        sprintf (buffer, "Cadena introducida: %s. OK!\n\n", str);
        out (buffer);

        out ("Introduce numero entero: ");
        in (str);

        sprintf (buffer, "Numero introducido + 1: %d. OK!\n", atoi (str) + 1);
        out (buffer);

        return 0;
}
Parece muy sencillo, pero este trabajo me ha llevado 2 tardes xD.

Última edición por GagleKas; 22/10/2009 a las 12:16
  #4 (permalink)  
Antiguo 22/10/2009, 12:05
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Respuesta: Problema con read

Hola,

Cita:
Iniciado por GagleKas Ver Mensaje
Tu codigo me da error pero me aclaraste sin querer el problema.
Je, je ... ciertamente, realmente no comprobé completamente que funcionara bien. Ahora bien, si read() por algún motivo no puede leer de la terminal, regresa un valor de -1 y pone errno. Por lo que quedaría buffer[-1] = '\0', y podría haber un buffer overflow en la función strcpy.

Saludos,
  #5 (permalink)  
Antiguo 22/10/2009, 12:09
 
Fecha de Ingreso: abril-2008
Mensajes: 141
Antigüedad: 16 años
Puntos: 0
Respuesta: Problema con read

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,



Je, je ... ciertamente, realmente no comprobé completamente que funcionara bien. Ahora bien, si read() por algún motivo no puede leer de la terminal, regresa un valor de -1 y pone errno. Por lo que quedaría buffer[-1] = '\0', y podría haber un buffer overflow en la función strcpy.

Saludos,
OK, gracias por el dato. Ahora modifico el codigo de arriba para que sea util para alguien.

Saludos.

Última edición por GagleKas; 22/10/2009 a las 12:17
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:44.