¿Leer DATOS de un fichero que no sea de texto?¿Como?

Bass
24 de Agosto del 2005
¡Hola de nuevo!

Bueno, el problema es que estoy haciendo dos aplicaciónes para una práctica. Una es un cliente y la otra es el servidor de ficheros. Los programas son en C bajo Linux.

Bueno el caso es que lo de los sockets no tengo mucho problema. Cuando tengo que enviar archivos de texto al cliente, no hay problema, se que hay que ir leyendo caracteres (char) del fichero.

Pero, ¿Y si quiero enviar por ejemplo un archivo ZIP, una aplicacion...?¿ En que tipo de datos tengo que guardar lo que leo del fichero? No me refiero a que el fichero tenga algun tipo de estructura, sino a leerlo "RAW" en crudo y mandarlo en crudo. Y no me han recomendado usar la funcion sendfile porque dicen que no es portable.

Para los de texto uso fread, y guardo lo leido en un array de caracteres. ¿Pero en este otro?¿Tengo que leer tb "caracteres" aun a sabiendasa que no son caracteres?

¡Muchas gracias!

Luis
24 de Agosto del 2005
Hola fijate que yo estoy haciendo un programa para enviar archivos de texto y tengo problemas seria mucha molestia si me ayudas con estoy usando fread y send pero lo unico que consigo que envie es el nombre del archivo. te agradezco de antemano tu ayuda

Alejandro_
24 de Agosto del 2005
Sí.
Un char es la unidad para los otros tipos, no necesariamente quiere decir "caracter" y menos "caracter imprimible". Un unsigned char es un valor entero entre 0 y 255, sólo eso.

Alejandro

Bass
24 de Agosto del 2005
¡Muchas gracias! En cuanto pueda lo hago.

Lo que leo lo voy mandando por el socket al cliente, que ya se encarga de leerlo. Lo que tengo es un array de char, pero ahora que me has dicho esto, lo cambiaré a un array de unsigned char.

¿O sea que lo que me dices sería más o menos así?

FILE *fichero;
int numBytesLeidos = 0;
unsigned char datos[10];
fichero = fopen("prueba.zip","rb");

while(!feof(fichero))
{
numBytesLeidos = fread(datos,sizeof(unsigned char),10,fichero;
if(numBytesLeidos == 10)
(... Enviar por el socket con send...)
}

fopen(fichero);

-------------------------------------
¿Sería correcto esto?

Tb querría preguntarte si para leer ficheros binarios hay que pasarle como parámetro a fopen "r" o "rb". Es que he leido en varios sitios y no me aclaro.

Y luego: ¿Hay que hacer algo con el EOF? ¿Al terminar de escribir en un fichero hay que "escribir" el EOF? ¿Si es así como?

Bueno, si respondeis a estas dudas ya no tendría ningun problema.

Alejandro_
24 de Agosto del 2005
Supongo que si lees el archivo de a pedacitos de diez char, es posible que no alcances la marca de final de archivo. Quizás puedas enviar el archivo completo, leyéndolo primero y poniéndolo en un buffer. Acá abajo va un ejemplo de cómo poner todo el archivo en un array de caracteres (Código en C):

#include <stdio.h>
#include <stdlib.h>

int main () {
FILE *archivo;
long tam;
char *buffer;

archivo = fopen ( "elZip.zip" , "rb" ); // rb porque es de tipo binario.
if (archivo==NULL) exit (1); // ni leerlo pudo...

// tamaño del archivo:
fseek (archivo , 0 , SEEK_END); // desplaza el puntero de archivo hasta el final.
tam = ftell (archivo); // guarda esa posición (en unidades char, o sea: su longitud).
rewind (archivo); // vuelve al principio.

// asigna memoria para el array que guardará el archivo completo:
buffer = (char*) malloc (tam);
if (buffer == NULL) exit (1); // no hay memoria disponible.
/* en Windows el espacio virtual de tu programa es de unos 6 GB, así que sólo podría no haber memoria suficiente si no hay espacio en disco o si el swap está limitado o... algo se rompió. Te comento esto porque una vez -por error- puse un film de 600 MB en una variable de estas y no hubo ningún problema */

// pasa todo el archivo al array buffer:
fread (buffer,1,lSize,archivo);

// ... lo envías de un zapatazo...
// ...


// al salir:
fclose (archivo);
free (buffer);
return 0;
}

// Alejandro


Alejandro_
24 de Agosto del 2005
> fread (buffer,1,lSize,archivo);

Ejem... está claro que no lo compilé...

cambia esa lína por
fread (buffer, 1, tam, archivo);