¿Posición de ficheros en C?

Cuestiones en general sobre tecnología e informática que no tengan cabida en el resto de foros.
Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2838
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 52 veces
Gracias recibidas: 233 veces
Contactar:

¿Posición de ficheros en C?

Mensajepor zup » 23 May 2020, 16:44

Estoy un poco confundido con las funciones de obtener/establecer la posición de un fichero en C. Todo esto viene por una serie de herramientas para tratar con ficheros binarios que estoy escribiendo y, en concreto, por una función que intenta convertir una cadena de tamaño en un número (p.ej.: pasar de "128k" a 131072).

El caso es que en stdio.h hay dos parejas de funciones dedicadas a obtener/establecer la posición. Una pareja es fsetpos/fgetpos, mientras que la otra es fseek/ftell (aunque posiblemente se puedan mezclar unas y otras).

En el caso de fsetpos/fgetpos se usa el tipo fpos_t. Este tipo en mi compilador es un long long int (un tipo de 64 bits) pero en todas partes advierten que en otros sistemas puede ser algo más complejo (como un struct, por ejemplo). El caso es que, debido a esto, fpos_t no debería usarse como un número (aunque MinGW lo define como long long int y posiblemente se pueda usar como tal), lo que lo hace algo inútil (¿cómo hago un fsetpos a la típica posición índice*registro si fpos_t puede no ser un número?).

La segunda pareja es fseek/ftell. Aquí el índice es un long (no especifica ni long int ni unsigned long int en un foro dicen que debe tener signo porque ftell devuelve -1 en caso de error), que en mi sistema es de 32 bits. Lo que nos lleva a ver que (en principio) no podemos acceder con fseek a posiciones más allá de 2 gigas -1 (long int) o 4 gigas -1, a pesar de que el sistema de ficheros admita ficheros más grandes.

Todo esto viene porque quería limitar la salida de mi función a 4 gigas, pero parece que he destapado una serie de problemas en C. Por lo visto tenemos que:
- Si queremos ir directamente a una posición de un fichero (calculada matemáticamente), no podemos ir más allá de los 2 primeros gigas.
- fsetpos puede ir más allá de los dos gigas, pero (al menos en teoría) no podemos poner una posición que hayamos calculado.
- Me pregunto que pasará si pillo una ISO de un DVD (más de 4 gigas) le hago un fseek a SEEK_END y luego le pido un ftell.

¿Es todo esto correcto? ¿Alguna manera de ir directamente al byte 3 gigas y medio desde C normalito?

EDITO: Acabo de encontrar que otras funciones (ftello, ftello64) que parecen admitir punteros más gordos, pero a saber cómo son de portables...
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
robcfg
Amiga 2500
Amiga 2500
Mensajes: 2079
Registrado: 07 May 2009, 15:34
Sistema Favorito: Amstrad CPC
primer_sistema: Atari 800XL/600XL
Ubicación: Estocolmo
Gracias dadas: 510 veces
Gracias recibidas: 125 veces

Re: ¿Posición de ficheros en C?

Mensajepor robcfg » 23 May 2020, 19:55

Tiene que ser C por narices?

Parece que las stream de la librería estándar de C++ tienen equivalentes de esas funciones que te pueden ayudar.

Por ejemplo: https://www.cplusplus.com/reference/ist ... eam/tellg/

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 2838
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 52 veces
Gracias recibidas: 233 veces
Contactar:

Re: ¿Posición de ficheros en C?

Mensajepor zup » 24 May 2020, 09:41

Prefiero que sea en C.

Ya me está costando recordar C, como para liarme con C++. El mayor problema es que todavía no tengo totalmente claro todo lo que sabía de C... hasta que no tenga claro todo eso, pasarme a C++ va a ser otra fuente de problemas.

Ahora mismo, estoy pensando que todo ese problema con la posición de ficheros quizás no sea tan grave... el objetivo es hacer pequeños programas que sean compilables en Linux y Windows (¿y quizás en Mac?). Supongo que lo que se puede compilar en MinGW, también se puede compilar sin cambios en GCC (los que usen compiladores de Microsoft que se busquen la vida).

Supongo que la mejor opción será usar fopen64/fseeko64/ftello64.

De momento, voy a descartar este problema... los programas que estoy haciendo son herramientas de línea de comandos para manipular ficheros de ROMs (p.ej.: quitar los n primeros bytes de un fichero, o rellenar el fichero hasta alcanzar un tamaño definido) que seguro que ya existen. En este contexto, nadie espera que una ROM mida 2 gigas o más... así que si el tamaño solicitado excede ese tamaño soltaré un error.

Pero sigo con la sensación de que acabaré encontrando ese problema más adelante...
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!


Volver a “Tecnología e informática”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado