elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Lidiar con archivos largos en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Lidiar con archivos largos en C++  (Leído 1,782 veces)
Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Lidiar con archivos largos en C++
« en: 2 Noviembre 2018, 14:07 pm »

He terminado un programa y me he topado con un par de bugs.

Uno de ellos tiene que ver con obtener el tamaño de un archivo. Utilizo el siguiente codigo para obtener el tamaño del archivo:

Código
  1.  
  2. #define __USE_FILE_OFFSET64
  3. #define __USE_LARGEFILE64
  4. #define __USE_LARGEFILE
  5.  
  6. // Mucho codigo despues...
  7.  
  8. unsigned int getFileSize(string fileName) {
  9.    unsigned int tempReturn = 0;
  10.  
  11.    FILE *temp = fopen64(fileName.c_str(), "rb");
  12.  
  13.    if (temp != NULL) {
  14.        feeko64(temp, 0, SEEK_END);
  15.        tempReturn = ftello64(temp);
  16.        fclose(temp);
  17.    }
  18.  
  19.    return tempReturn;
  20. }
  21.  
  22.  

El caso es que pese a usar "fopen64()" e incluir los "#define" para usar archivos largos, no supera los 2GB. Estoy haciendo pruebas con un archivo de 2,7GB y me dice que el tamaño es de 2GB.

¿Alguna idea de como puedo solucionarlo?

Lo incluyo todo correctamente y el compilador no me da ningun error. ¿Tendría que añadir algun parametro mas a la orden de compilado?

Uso ubuntu y codeblocks. Supongo que esto es portable a Windows y para mi proximo proyecto necesito dejarlo zanjado porque lo desarrollaré para ambos sistemas operativos.


En línea

huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: Lidiar con archivos largos en C++
« Respuesta #1 en: 2 Noviembre 2018, 17:15 pm »

Creo que el error es la variable tempReturn, la cúal es un int sin signo, pero es extraño, ya que un integer sin signo debería tener un rango de 4294967296.
Has tratado con un double o float? Eso si, esos tipos de datos son flotantes, pero creo que resolverá tu problema.


« Última modificación: 3 Noviembre 2018, 00:10 am por konniskatt » En línea

Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Lidiar con archivos largos en C++
« Respuesta #2 en: 2 Noviembre 2018, 18:57 pm »

Nada. Con Double o Float me lanza un error de compilacion diciendo algo del "unsigned". Me parece que dice que no se pueden combinar.

De todos modos, me parece que eso no debería ser problema. Me parece que el problema viene de las funciones FILE. Ya probe tambien a usar "tempReturn++;" para comprobar si el limite venía del "unsigned int", pero no pasaba nada fuera de lo normal. Solo devolvía un byte por encima de los 2GB.

¿Alguna otra idea?
En línea

elgilun

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: Lidiar con archivos largos en C++
« Respuesta #3 en: 2 Noviembre 2018, 20:53 pm »

Desde C++17 está disponible la librería <filesystem> o para algún estándar anterior está también boost::filesystem

Se puede usar directamente file_size()

Código:
#include <filesystem>

uintmax_t getFileSize(const std::string& fileName)
{
    return std::filesystem::file_size(fileName);
}
En línea

Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Lidiar con archivos largos en C++
« Respuesta #4 en: 3 Noviembre 2018, 15:30 pm »

Personalmente prefiero usar un codigo algo enrevesado que andar usando librerias extra. Mas que nada para poder mover el codigo fuente entre maquinas y no tener que andar instalando en todas ellas todas las liberias posibles.

He visto que tengo una funcion llamada "filength()". ¿Esa me servirá para este caso concreto?

De todos modos, sigo teniendo el problema de leer y escribir mas allá de los 2GB. En el ejemplo que he puesto solo necesito el tamaño del archivo, pero mas adelante voy a necesitar la opcion de trabajar con archivos de un tamaño superior a los 2GB. Ese es el verdadero problema.
En línea

huchoko

Desconectado Desconectado

Mensajes: 97


Ver Perfil WWW
Re: Lidiar con archivos largos en C++
« Respuesta #5 en: 3 Noviembre 2018, 15:43 pm »

De casualidad estás en una PC de 32 bits?
En línea

Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Lidiar con archivos largos en C++
« Respuesta #6 en: 3 Noviembre 2018, 19:02 pm »

Uso maquinas de 32 bits, 64 bits y ARM. Para el desarrollo de este programa estoy usando una maquina de 64 bits.

Dudo mucho que un sistema operativo de 32 bits sea quien limite el uso de archivos superiores a 2GB. ¿A caso no puedes ver videos de mas de 2GB en un equipo de 32 bits?

Pues de eso va la cosa. De eliminar esa limitacion que no sé de donde viene y poder trasladar el codigo fuente sin tener que instalar librerias extra en el resto de maquinas. Y finalmente poder usar el programa compilado en maquinas de 32 bits, 64 bits y ARM.
En línea

elgilun

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: Lidiar con archivos largos en C++
« Respuesta #7 en: 3 Noviembre 2018, 20:14 pm »

<filesystem> es estándar C++, es como usar cout o cin, nada más portable.
En línea

Desiresportal

Desconectado Desconectado

Mensajes: 57


Ver Perfil
Re: Lidiar con archivos largos en C++
« Respuesta #8 en: 4 Noviembre 2018, 13:35 pm »

"#include <filesystem>" no me funciona. Codeblocks no me la reconoce como una libreria existente.

Tambien he probado a leer caracter por caracter con "fgetc()" para asegurarme que el problema no venía de "fseeko64()" y un posible limite. La conclusion es que cualquier operacion con el sistema de archivos supone un problema para archivos mayores de 2GB.

Ya no sé que mas hacer sin instalar librerias extra.
En línea

elgilun

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: Lidiar con archivos largos en C++
« Respuesta #9 en: 4 Noviembre 2018, 15:30 pm »

Codeblocks no es un compilador, es un editor para código que usa un compilador.

Deberías poder actualizar tu compilador (un gcc 8, por ejemplo) y verificar que en las propiedades de tu proyecto se incluya la opción "-std=c++1z" o "-std=c++17".

Suerte
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
necesito ayuda quiero grabar archivos largos
Grabadoras
ojcar 2 960 Último mensaje 31 Mayo 2004, 20:29 pm
por Mordor
Apagados excesivamente largos « 1 2 »
Windows
Gambinoh 10 3,626 Último mensaje 30 Agosto 2011, 08:08 am
por Randomize
Problema con números largos
Programación C/C++
DickGumshoe 6 2,619 Último mensaje 5 Julio 2012, 12:28 pm
por DickGumshoe
Cuatro extensiones para lidiar con la sobrecarga de pestañas en Chrome
Noticias
wolfbcn 0 1,044 Último mensaje 23 Abril 2013, 12:55 pm
por wolfbcn
¿Harto de lidiar con Power Point? Bunkr se ha propuesto jubilarlo
Noticias
wolfbcn 0 1,072 Último mensaje 27 Agosto 2013, 03:01 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines