Estás en: Inicio >> Foros >> Informática >> Programación
Programación /

Leer/escribir archivos binarios

Participa en el tema Leer/escribir archivos binarios en el foro Programación.
Hola! tengo q hacer un programita en linux utilize sockets, y quiero q pase un ...

Buscar en este tema:
1 2 >
 
  •  
    #1 Leer/escribir archivos binarios
    Hola! tengo q hacer un programita en linux utilize sockets, y quiero q pase un archivo, pero cualquier archivo. Asiq lo tengo q leer y escribir en formato binario pero no puedo.
    Las funciones q utilizo son:

    CLIENTE:

    PARA ABRIR:
    Código:
    fopen(archivo,"rb")
    
    PARA LEER:
    Código:
    getc(origen)
    
    SERVIDOR:

    PARA CREAR ARCHIVO:
    Código:
    fopen(nombre,"wb")
    
    PARA ESCRIBIR:
    Código:
    putc(caracter,destino)
    
    O sea mi problema radica en la forma q leo y/o escribo el archivo, xq la conexion anda bien xq lo he probado leyendo un archivo plano con otras funciones y anda, pero con el archivo plano lo q hacia era leer el contenido y pasarlo.
    +
     
    0
    Me gusta
     
    | Más
  • #2 Re: Leer/escribir archivos binarios

    Las funciones que tenes que usar son las de manejo de archivos estandard de C. que son fread, fwrite y manejan buffers de datos...

    Lo ideal seria que definas "tu protocolo" de transferencia, es decir el servidor tiene que saber cuantos bytes va a tener el arcihvo que le van a mandar, sino no sabe cuantos bytes va a tener que leer del socket...

    La idea seria asi... El cliente le envia cantidad de bytes a enviar, el servidor lee ese numero del socket y crea un buffer de ese tamaño con:

    char* buffer = (char*) malloc(size* sizeof(char));

    status = recv(socket, ....., buffer);

    fwrite(buffer, sizeof(char), size, archivo);
    fclose(archivo);

    El cliente lo que hace es obtener el tamaño del archivo en bytes y enviarle el contenido:

    fseek(archivo, 0, SEEK_END);
    size_t size = ftell(archivo);
    fseek(archivo, 0, CUR_SET);

    char* buffer = (char*) malloc(position*sizeof(char));

    fread(buffer, sizeof(char), size, archivo);
    send(socket...... &size);
    send(socket....... buffer);
    fclose(archivo);

    Con esto ya tenes todo...

    Saludos
    Pablo
    Me gusta este mensaje
  • #3 Re: Leer/escribir archivos binarios

    Ahora pruebo con todo eso q me dijiste... ahora me podrias explicar las fc fseek, size_t size, ftell xq las busque en una pagina pero no entendi para q sirven exactamente. saludos y gracias.

    PROBE EL CLIENTE

    ahi me decis q haga un fseek(archivo, 0, CUR_SET) cuando compilo me dice q no esta definida CUR_SET y me fije en la fc fseek
    Y los parametro o como se llamen, son SEEK_END, SEEK_SET, SEEK_CUR pero no se cual es xq no entiendo el funcionamiento de la fc. Saludos


    DESPUES DE UN RATO DE PROBAR...

    me da error de segmentacion en el servidor, pero creo q el error mio esta en el cliente q no esta mandando bien el tamaño del buffer. me quedo asi...

    Código:
    //ABRIMOS EL ARCHIVO Q VAMOS A ENVIAR
        archivo=abrir_archivo();
    
        //ENVIAMOS EL TAMANIO DEL BUFFER
        fseek(archivo, 0, SEEK_END);
        size_t size = ftell(archivo);
        fseek(archivo, 0, SEEK_CUR);
        char* buffer = (char*)malloc(size*sizeof(char));
        bytes_enviados=send(conector, &size, sizeof(char), 0);
    
    Editado por gaboblanch - 20.07.2009 19:25 hs.
    Me gusta este mensaje
  • #4 Re: Leer/escribir archivos binarios

    Originalmente publicado por gaboblanch Ver mensaje
    Ahora pruebo con todo eso q me dijiste... ahora me podrias explicar las fc fseek, size_t size, ftell xq las busque en una pagina pero no entendi para q sirven exactamente. saludos y gracias.

    PROBE EL CLIENTE

    ahi me decis q haga un fseek(archivo, 0, CUR_SET) cuando compilo me dice q no esta definida CUR_SET y me fije en la fc fseek
    Y los parametro o como se llamen, son SEEK_END, SEEK_SET, SEEK_CUR pero no se cual es xq no entiendo el funcionamiento de la fc. Saludos


    DESPUES DE UN RATO DE PROBAR...

    me da error de segmentacion en el servidor, pero creo q el error mio esta en el cliente q no esta mandando bien el tamaño del buffer. me quedo asi...

    Código:
    //ABRIMOS EL ARCHIVO Q VAMOS A ENVIAR
        archivo=abrir_archivo();
    
        //ENVIAMOS EL TAMANIO DEL BUFFER
        fseek(archivo, 0, SEEK_END);
        size_t size = ftell(archivo);
        fseek(archivo, 0, SEEK_CUR);
        char* buffer = (char*)malloc(size*sizeof(char));
        bytes_enviados=send(conector, &size, sizeof(char), 0);
    
    Son todas funciones estandard de C / C++ y todas se encuentran en stdio.h para C y cstdio.h para C++, asi que si o si las tenes que incluir cualquiera de esos headers depende si estas compilando codigo C o codigo C++ (Depende del compilador)...

    la funcion fseek busca y se posiciona en una posicion dentro de un archivo tipo stream (FILE* en C / C++) en la posicion dada por el segundo parametro en la direccion definida en el tercer parametro, basicamente

    si yo abri un archivo y estoy al comienzo, hacer fseek(archivo, 0, SEEK_END) lo que hace es me posiciona en la posicion 0 del archivo comenzando desde el final del archivo.

    Si le paso SEEK_SET es desde cl comienzo y SEEK_CUR desde la posicion actual donde me encuentro....

    ftell(archivo) lo que hace es devolverme la posicion dentro del archivo stream en la que me encuentro posicionado para una operacion de lectura / escritura...

    Si combinamos un fseek(archivo, 0, SEEK_END) y un ftell(archivo) obtenemos la cantidad de bytes del archivo de forma estandard en C sin hacer uso de las librerias del sistema operativo... y si volvemos a hacr un fseek(archivo, 0, SEEK_SET) volemos al comienzo del archivo para que al momento de leer leamos desde el comienzo del mismo...

    Saludos
    Pablo
    Me gusta este mensaje
  • #5 Re: Leer/escribir archivos binarios

    Originalmente publicado por gaboblanch Ver mensaje
    DESPUES DE UN RATO DE PROBAR...

    me da error de segmentacion en el servidor, pero creo q el error mio esta en el cliente q no esta mandando bien el tamaño del buffer. me quedo asi...

    Código:
    //ABRIMOS EL ARCHIVO Q VAMOS A ENVIAR
        archivo=abrir_archivo();
    
        //ENVIAMOS EL TAMANIO DEL BUFFER
        fseek(archivo, 0, SEEK_END);
        size_t size = ftell(archivo);
        fseek(archivo, 0, SEEK_CUR);
        char* buffer = (char*)malloc(size*sizeof(char));
        bytes_enviados=send(conector, &size, sizeof(char), 0);
    
    Tenés mal casi todos los parámetros de send(). Leé la documentación.
    Además te olvidaste de cargar el contenido del archivo en el buffer.
    Me gusta este mensaje
  • #6 Re: Leer/escribir archivos binarios

    jeje no te quiero marear pero es importante, acordate de liberar la mermoria al final con esto:
    free(buffer);
    Me gusta este mensaje
  • #7 Re: Leer/escribir archivos binarios

    Originalmente publicado por AGUSTIN_RAMONE Ver mensaje
    jeje no te quiero marear pero es importante, acordate de liberar la mermoria al final con esto:
    free(buffer);
    Eso lo hago.

    Originalmente publicado por pangus Ver mensaje
    Tenés mal casi todos los parámetros de send(). Leé la documentación.
    Además te olvidaste de cargar el contenido del archivo en el buffer.
    El contenido lo cargo en otra funcion, y los parametros no estan mal xq he estado enviando el contenido de archivo planos, pero con un buffer seteado con anterioridad.
    Ahora con eso de q le tengo q enviar la longitud del buffer, ahi cambie un par de cosas. Pero igual tampoco me da error.
    Me gusta este mensaje
  • #8 Re: Leer/escribir archivos binarios

    PARA IR DESCARTANDO:

    CLIENTE-->el envio del tamaño del archivo o del buffer esta bien asi??

    Código:
    //ENVIAMOS EL TAMANIO DEL BUFFER
        fseek(archivo, 0, SEEK_END);
        size_t size = ftell(archivo);
        fseek(archivo, 0, SEEK_SET);
        char* buffer = (char*)malloc(size*sizeof(char));
        bytes_enviados=send(conector, &size, sizeof(char), 0);
    
    SERVIDOR-->Ahora para recibirlo del otro lado creo q esta mal,

    Código:
    /**RECIBIMOS TAMANIO DEL BUFFER DATOS**/
            bytes_recibidos = recv(cliente, tamanio,sizeof(int),0);
            char* buffer = (char*) malloc(tamanio*sizeof(char));
    
    tamanio es del tipo int*, mi intencion era q ahi se guarde el tamaño del buffer para utilizarlo con malloc y crear el buffer para recibir el archivo.
    Asi es como envio y recibo pero en el servidor algo esta mal xq me da fallo de segmentacion.
    Editado por gaboblanch - 21.07.2009 13:24 hs. | Motivo: Se me chispoteo un *
    Me gusta este mensaje
  • #9 Re: Leer/escribir archivos binarios

    Originalmente publicado por gaboblanch Ver mensaje
    Pero igual tampoco me da error.
    Si hacía falta una prueba más de lo pernicioso que es recomendarles C a los principiantes, acá está. El pibe piensa que está haciendo todo bien “porque no le da error”.
    Me gusta este mensaje
  • #10 Re: Leer/escribir archivos binarios

    Vos te seguis refiriendo por el tema de la funcion send, decime cuales son los parametros correctos si es q estan mal. Pero lo q te quise decir es q antes de ponerme a tratar de enviar el tamaño los tenia asi
    Código:
    bytes_enviados=send(conector, buffer, 512*sizeof(char), 0);
    
    Y asi me funcionaba perfecto, entonces supongo q esta bien usado. Y otra cosa si vas a aportar q sea para decirme donde tengo el error exactamente xq para eso cree el tema. Suerte!!!
    Me gusta este mensaje
1 2 >
Estás en: Inicio >> Foros >> Informática >> Programación


Estadísticas del tema
  • 17 RESPUESTAS
  • 2710 VISTAS
  • 4 USUARIOS RESPONDIERON
 
Ir arriba
Contacto | Acerca de | Ayuda | Términos Legales | privacidad | Pautas de convivencia | Mapa de los foros | TrabajÁ con nosotros
©2008 Psicofxp.com S.A. - Todos los derechos reservados
Certifica IAB