• Martes 14 de Mayo de 2024, 23:26

Autor Tema:  fseek  (Leído 4990 veces)

maxstepin

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
fseek
« en: Lunes 19 de Octubre de 2009, 12:20 »
0
hola.

fseek(archivo, 0, SEEK_END);
        printf("ntamaño del archivo %lu", (ftell(archivo)));

este codigo me indica el tamaño de un determinado archivo. lo he probado y funciona solo en archivos pequeños. cuando lo pruebo en archivos de 4GB o mas, se imprime 0 como resultado. hay veces que en archivos de 3,5GB si da un resultado, pero es incorrecto.

como podria averiguar el tamaño de archivos de 4GB o mas? hay algun limite para el tamaño de archivo?

saludos. :lol:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: fseek
« Respuesta #1 en: Lunes 19 de Octubre de 2009, 12:39 »
0
Todo depende del sistema operativo y del sistema de ficheros. Hay sistemas de ficheros que no soportan ficheros de más de 2 GB o más de 4 GB... Esto implica que, aunque ftell() en el estándar POSIX devuelva long, es probable que sistemas que no cumplan el estándar 100% no devuelvan long (o ponga long pero en realidad usen int internamente, es imposible saber sin tener el código fuente del SO).

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fseek
« Respuesta #2 en: Lunes 19 de Octubre de 2009, 12:51 »
0

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

maxstepin

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: fseek
« Respuesta #3 en: Lunes 19 de Octubre de 2009, 13:02 »
0
Cita de: "m0skit0"
Todo depende del sistema operativo y del sistema de ficheros. Hay sistemas de ficheros que no soportan ficheros de más de 2 GB o más de 4 GB... Esto implica que, aunque ftell() en el estándar POSIX devuelva long, es probable que sistemas que no cumplan el estándar 100% no devuelvan long (o ponga long pero en realidad usen int internamente, es imposible saber sin tener el código fuente del SO).

perdona, no especifique. OS: windows 7 x86, compilador: Mingw32.
sistema de archivos: NTFS, si hay archivos de 8 GB (tranquilamente) en este sistema de ficheros, fseek deberia funcionar correctamente tambien, no? o a lo mejor el problema es ftell?

igual, en mi sistema un long pesa lo mismo que un int (?), no deberia ser de 8 bytes?

la funcion de la API, GetFileSizeEx, solo funcionara en sistemas windows, pero que funcion de libreria estandar me puede ayudar?, ya sabes por lo de la portabilidad.

saludos :comp:

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: fseek
« Respuesta #4 en: Lunes 19 de Octubre de 2009, 13:12 »
0
Cita de: "maxstepin"
la funcion de la API, GetFileSizeEx, solo funcionara en sistemas windows, pero que funcion de libreria estandar me puede ayudar?
Ya te digo que Windows no cumple los estándares, así que si programas para Windows, mejor olvídate de la portabilidad.

maxstepin

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: fseek
« Respuesta #5 en: Lunes 19 de Octubre de 2009, 13:27 »
0
Cita de: "m0skit0"
Cita de: "maxstepin"
la funcion de la API, GetFileSizeEx, solo funcionara en sistemas windows, pero que funcion de libreria estandar me puede ayudar?
Ya te digo que Windows no cumple los estándares, así que si programas para Windows, mejor olvídate de la portabilidad.
Entonces, si programo bajo Linux, me puedo olvidar de una funcion que me diga el tamaño de un archivo de 8 GB? o su sistema de archivos(de Linux) no soporta archvos de 8 GB?

algun dia tengo pensado codificar para UNIX/Linux, pero primero aprender bajo windows, o si no estoy perdido.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: fseek
« Respuesta #6 en: Lunes 19 de Octubre de 2009, 13:30 »
0
Cita de: "maxstepin"
si programo bajo Linux, me puedo olvidar de una funcion que me diga el tamaño de un archivo de 8 GB?
Linux sí conforma más a POSIX (aunque no totalmente), así que ftell() debería funcionar bien.

maxstepin

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: fseek
« Respuesta #7 en: Lunes 19 de Octubre de 2009, 14:01 »
0
La unica solucion bajo windows es usar getfilesizeex? no hay nada mas?

r0d

  • Miembro activo
  • **
  • Mensajes: 37
  • Nacionalidad: fr
    • Ver Perfil
    • http://r0d.developpez.com/index-es.php
Re: fseek
« Respuesta #8 en: Lunes 19 de Octubre de 2009, 14:26 »
0
Una solucion portable y que estara incluida probablemente en el proximo estandar c++1x: boost::filesystem

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: fseek
« Respuesta #9 en: Lunes 19 de Octubre de 2009, 14:30 »
0
Cita de: "maxstepin"
La unica solucion bajo windows es usar getfilesizeex? no hay nada mas?
Pues va a ser que no. Quejas al de la foto.

maxstepin

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: fseek
« Respuesta #10 en: Lunes 19 de Octubre de 2009, 15:27 »
0
Cita de: "m0skit0"
Cita de: "maxstepin"
La unica solucion bajo windows es usar getfilesizeex? no hay nada mas?
Pues va a ser que no. Quejas al de la foto.
ese soy yo. a que soy guapo?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fseek
« Respuesta #11 en: Lunes 19 de Octubre de 2009, 18:08 »
0
A ver, que yo sepa en x86 un long ocupa 4 bytes y el standard dice unicamente cual es el tamaño minimo que debe tener (32 bits, 4 bytes). ¿Esto existe por casualidad? Apostaria a que los que crearon la funcion (que es ANSI C) hace siglos no esperaban archivos de mas de 4GB  :clown:

http://www.mkssoftware.com/docs/man3/ftell.3.asp

Mas referencias:
"On many (but not all) C and C++ implementations, a long is larger than an int. Today's most popular desktop platforms, such as Windows and Linux, run primarily on 32 bit processors and most compilers for these platforms use a 32 bit int which has the same size and representation as a long."

http://home.att.net/~jackklein/c/inttypes.html#long
http://software.intel.com/en-us/article ... re-and-os/

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: fseek
« Respuesta #12 en: Martes 20 de Octubre de 2009, 13:38 »
0
Cita de: "Eternal Idol"
A ver, que yo sepa en x86 un long ocupa 4 bytes
¿Sí? Que yo sepa un int ocupa 4 bytes (modo protegido)  :huh:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fseek
« Respuesta #13 en: Martes 20 de Octubre de 2009, 13:50 »
0
Cita de: "m0skit0"
¿Sí? Que yo sepa un int ocupa 4 bytes (modo protegido)  :huh:

Si y en cuanto a tamaño son lo mismo, ver referencias.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

maxstepin

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: fseek
« Respuesta #14 en: Martes 20 de Octubre de 2009, 16:24 »
0
i que tal :

Código: C
  1.  
  2. #include <stdio.h>
  3. #include <sys/stat.h> /* Para la estructura stat */
  4. #include <unistd.h>
  5.  
  6. main(int argc, char **argv)
  7. {
  8.     struct stat64 buf;
  9.  
  10.     printf("%sn",argv[1]);
  11.  
  12.     if ( stat64(argv[1], &buf) == -1 )
  13.     {
  14.         perror(argv[1]);
  15.         getchar();
  16.         exit(-1);
  17.     }
  18.     else
  19.     {
  20.         printf("Tamaño del archivo %s %d bytes.n",argv[1],buf.st_size);
  21.     }
  22.     getchar();
  23. }
  24.  

en stat(), a secas si que funciona, pero no se como hacer para usar stat64(), crear un puntero a una estructura stat64? me tira error: undefined reference to stat64.

GetFileSize, es una solucion que no me convence, lejos de la portabilidad, es un codigo poco elegante, se depende demasiado de la API. :bad:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fseek
« Respuesta #15 en: Martes 20 de Octubre de 2009, 22:58 »
0
¿Esa funcion es standard? Sino lo es entonces es un codigo poco elegante ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: fseek
« Respuesta #16 en: Miércoles 21 de Octubre de 2009, 03:40 »
0
Si y no:
Cita de: "man stat64"
TRANSITIONAL DESCRIPTION (NOW DEPRECATED)
     The fstat64, lstat64 and stat64 routines are equivalent to their corre-
     sponding non-64-suffixed routine, when 64-bit inodes are in effect.  They
     were added before there was support for the symbol variants, and so are
     now deprecated.  Instead of using these, set the _DARWIN_USE_64_BIT_INODE
     macro before including header files to force 64-bit inode support.
Eso es en Darwin, pero no me estrañaria que otros sistemas operativos digan lo mismo, es mas, Open Group no lo documenta, asi que no es POSIX.
Mejor usar stat y compilador de 64 bits.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fseek
« Respuesta #17 en: Miércoles 21 de Octubre de 2009, 08:43 »
0
Si no hay funcion standard entonces da lo mismo usar un servicio de un S.O. en particular (ademas que estos suelen ser mas potentes y con #ifdef se soluciona cualquier problema de portabilidad del codigo).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: fseek
« Respuesta #18 en: Miércoles 21 de Octubre de 2009, 16:14 »
0
buenas:

yo lo que suelo hacer para portabilidad es usar el patrón factory y crear una clase para win32 y otra para unix.

entonces simplemente uso la api en uno y la stat en el otro.

suerte.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fseek
« Respuesta #19 en: Miércoles 21 de Octubre de 2009, 17:25 »
0
Cita de: "diego.martinez"
yo lo que suelo hacer para portabilidad es usar el patrón factory y crear una clase para win32 y otra para unix.

Una buena solucion para C++  :beer:

Cita de: "diego.martinez"
entonces simplemente uso la api en uno y la stat en el otro.

¿Pero stat no es capaz de devolver el tamaño de un archivo de mas de 4GB, verdad?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: fseek
« Respuesta #20 en: Jueves 22 de Octubre de 2009, 02:41 »
0
Cita de: "Eternal Idol"
¿Pero stat no es capaz de devolver el tamaño de un archivo de mas de 4GB, verdad?
Si estas en una maquina de 64 bits, si que puede... en 32 bits se supone que tambien, no se si en el Glibc actual arreglaron el problema, pero aqui lo documentan muy bien.
Cita de: "Eternal Idol"
Si no hay funcion standard entonces da lo mismo usar un servicio de un S.O. en particular (ademas que estos suelen ser mas potentes y con #ifdef se soluciona cualquier problema de portabilidad del codigo).
Me explique mal  :nosweat:
stat si es estandar, pero stat64 no lo es.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fseek
« Respuesta #21 en: Jueves 22 de Octubre de 2009, 10:15 »
0
Cita de: "su -"
Si estas en una maquina de 64 bits, si que puede... en 32 bits se supone que tambien, no se si en el Glibc actual arreglaron el problema, pero aqui lo documentan muy bien.

Si, pero en una de 32 bits no, el standard no lo soporta. Ahi lo que documentan es la API que tiene las funciones esas que terminan en 64 (ftello64 por ejemplo esta mencionada) pero no son standard.

Cita de: "su -"
Me explique mal  :nosweat:
stat si es estandar, pero stat64 no lo es.

Exacto, no hay funcion standard que te sirva para obtener el tamaño de un archivo de mas de 4GB en un Windows o GNULinux de 32 bits, de una manera u otra tenes que recurrir a funciones no standard (VC++ soporta _stat64 por cierto, con guion bajo por no ser standard).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

maxstepin

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: fseek
« Respuesta #22 en: Jueves 22 de Octubre de 2009, 19:00 »
0
Cita de: "Eternal Idol"
Exacto, no hay funcion standard que te sirva para obtener el tamaño de un archivo de mas de 4GB en un Windows o GNULinux de 32 bits, de una manera u otra tenes que recurrir a funciones no standard (VC++ soporta _stat64 por cierto, con guion bajo por no ser standard).
Pero el fichero <sys/stat.h> existe en la carpeta include de Mingw, quiero decir que no me lo he bajado de ningun sitio. SI viene de serie con el compilador, no es una libreria estandar?
en dicho fichero de cabecera esta declarado el prototipo de la funcion stat64.
Código: C
  1. _CRTIMP int __cdecl __MINGW_NOTHROW _stat64 (const char*, struct __stat64*);
  2.  
stat(), si que he podido usarla, y en archivos de mas de 4 GB no funciona, hay desboramiento de memoria.
Si compilo esta version:
Código: C
  1.  
  2. #include <stdio.h>
  3. #include <sys/stat.h> /* Para la estructura stat */
  4. #include <unistd.h>
  5.  
  6. main(int argc, char **argv)
  7. {
  8.     struct stat64 buf;
  9.  
  10.     printf("%sn",argv[1]);
  11.  
  12.     if ( stat64(argv[1], &buf) == -1 )
  13.     {
  14.         perror(argv[1]);
  15.         getchar();
  16.         exit(-1);
  17.     }
  18.     else
  19.     {
  20.         printf("Tamaño del archivo %s %d bytes.n",argv[1],buf.st_size);
  21.     }
  22.     getchar();
  23. }
  24.  
Me tira este error:
+statmain.c|66|error: storage size of 'buf' isn't known|

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: fseek
« Respuesta #23 en: Jueves 22 de Octubre de 2009, 19:38 »
0
No, no es standard, supongo que es parte de esa API que menciono su- y MinGW tiene la costumbre de usar la CRT del VC++.

En la MSDN.

No logro que haga el enlazado pero asi deberia compilar:
Código: C++
  1. struct __stat64 buf;
  2.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

maxstepin

  • Miembro activo
  • **
  • Mensajes: 32
    • Ver Perfil
Re: fseek
« Respuesta #24 en: Lunes 26 de Octubre de 2009, 01:28 »
0
todo lo hago desde el ide.
he probado "struct __stat64" sin resultados satisfactorios