La Web del Programador: Comunidad de Programadores
 
    Pregunta:  275 - ARCHIVOS EN C
Autor:  Andrés
Les escribo porque tengo un problema. Quiero hacer una función para calcular el tamaño de un archivo. Yo escribí una que funciona muy bien con los archivos de texto pero no con un ejecutable. Quisiera saber que está mal.
Esta es la función:
long FileSize(FILE *file)
{
long pos_actual, tam;
pos_actual = ftell(file);
fseek(file, 0L, SEEK_END);
tam = ftell(file);
fseek(file, pos_actual, SEEK_SET); /* vuelvo a poner el puntero donde estaba antes */
return tam;
}

  Respuesta:  Julio Alejandro
Hola, lamento no contenstarte tu pregunta, pero si de algo te sirve, he provado tu función en Turbo C++ 3.0 y funciona perfectamente bien, incluso con archivos ejecutables, te da exactamente el mismo valor en bytes que el que te indica un DIR del DOS, solo te puedo indicar que abri el archivo con FOPEN y de solo lectura, además imprimí el valor de regreso con un sencillo PRINTF(....%ld ....).  Checá bien :-)  Saludos.

  Respuesta:  Jose
Este pequeño programa te dice cual es la longitud en bytes de un archivo, en este caso el  nombre del archivo es netlog.txt, situado en el directorio c:\
#include
#include

main()
{
FILE *pf;
long  pos_fin=0;
clrscr();

/* apertura del fichero */
if( (pf = fopen("c:\\netlog.txt","rb")) == NULL)
{
perror("Error en la apertura del fichero.");
exit(-1);
}

if (fseek(pf,0L, SEEK_END)) /* posiciona el puntero del fichero al final del mismo */
{
perror("Error.");
fclose(pf);
exit(-2);
}
pos_fin = ftell(pf); /* nos devuelve la posición del puntero del fichero*/

printf("Longitud: %ld",pos_fin);

fclose(pf);
}


  Respuesta:  Daniel Osuna
El problema no esta en esa función, sino en la forma en que abrís el stream:

si lo abres en modo "rt", o algo parecido con t (texto): "wt", "r+t", "a+t", etc, el programa trasladará los CTRL-Z como fines de archivo y por lo tanto en el primer cracter 26 que encuentres dentro de un archivo binario, interpretará que llego al final del mismo.
Debes abrir el stream con modo b (binario)

arch=fopen( nomarch, "rb" );