por favor ayudenme con esto

Nico
01 de Septiembre del 2005
En ANSI C sobre Linux,necesito hacer un programa que dado un archivo lo copie(en realidad es solo una parte de un gran programa), probe leyendo y escribiendo hasta encontrar EOF, y con archivo de texto funciona, pero probe con .mp3, y no funciona, copia unos bytes nada mas.
Sin embargo si se me fijo la cantidad de bytes del archivo y leo esa cantidad exactamente funciona perfecto. EL problema es que yo me tengo que fijar la cantidad de bytes!! estuve buscando y no hay ninguna funcion ANSI que me diga la longitud del archivo, y HASTA AHORA tampoco encontre ninguna System Call de Linux que haga lo mismo.
Si alguien sabe alguna funcion o como contruirla por favor digamela, estare agradecido.

hiei
01 de Septiembre del 2005
Es evidente que en archivos binarios puedes encontrar un caracter de EOF en un lugar que no es el finalñ del archivo por su naturaleza de archivos binarios (EOF es una constante byte que igual a cualquier dto solo valida como marca en archivos de texto)
Para la longitud del archivo puedes usar un truco (creo que del "duo diamico" K&R)
long fsize (FILE *f) {
long z, p;
p = ftell (f);
fseek (f, 0, SEEK_END);
z = ftell (f);
fseek (f, p, SEEK_SET);
return z;
}
Aunque lo mas simple para una copia de archivos en este caso es hacer y dejar que la magia de *NIX haga el resto:
sprintf(s, "cp %s %s", archivo_origen, archivo_destino);
system(s);
Pero nececitas tener un shell (como bash, o tcsh) corriendo en el sistema lo cual es de esperarse(supongo que no sera un Linux embebido)
Aunque, ademas, system tiene algunos problemas de seguridad algo malos (bueno, siempre hablando potenialmente)
La otra es usar fread y fwrite con un buffer (tamaño a gusto y placer del consumidor) hasta que fread lea menos caracteres de los que le dijimos que lea.
Algo como esto:
...
char block[8192];
....
while (!feof(f)) {
int l = fread (block, sizeof(char), 8192, f);
fwrite (block,sizeof(char), l, f);
if (l<8192) break;
}
Ahora que lo pienso... ¡No estarias buscando la funcion int feof(FILE *f) que retorna 0 si se ha llegado al final del archivo?