[C con Clase] Problema al leer datos de un documento externo al programa

Steven Davidson srd4121 en njit.edu
Lun Abr 16 00:16:31 CEST 2012


Hola Marcos,

On 4/15/2012 5:05 PM, Marcos Collado wrote:
> Creo que el título se entiende poco, a ver si me explico mejor por
> aquí:
>
> Estoy intentando realizando un programa por el cual escriba datos en
> un documento .dat y lea de ellos. El caso es que tiene una estructura
> el documento:
>
> PRODUCTOS
>
> id producto "nombre" precio_compra precio_venta stock num_unidades
>
> ...
>
> id producto "nombre" precio_compra precio_venta stock num_unidades
>
> FIN PRODUCTOS
>
> Entonces como puedo hacer para leer los datos por ejemplo de
> precio_compra y luego reescribirlos en esa misma zona?
>

Necesitas más información en cuanto a la estructura o formato del 
fichero al igual que el "tipo" o modo de fichero: texto o binario. 
Sugiero que consultes nuestro curso sobre el Manejo de Ficheros en 
nuestra página; puedes ir directamente a: 
http://c.conclase.net/ficheros/index.php

Si se trata de un fichero binario con una longitud fija de los registros 
y por tanto de los campos, entonces no debería resultarte difícil 
acceder justamente a ese "campo" tanto para leer de ello como para 
modificarlo. Por ejemplo,

[id_producto (4 bytes)] [nombre (64 bytes)] [precio_compra (4)] 
[precio_venta (4)] [stock (4)] [num_unidades (4)]

Entonces el problema se convierte en una cuestión de calcular el 
desplazamiento (en bytes) desde el comienzo del fichero. De hecho, 
podemos pensar que el fichero no es más que un array y por tanto, nos 
interesa calcular el "índice" para llegar a tal byte. En el ejemplo 
anterior, cada registro es de 84 bytes. Si queremos calcular el 
desplazamiento para acceder al campo 'stock'  del tercer registro, 
entonces tenemos que hacer unos cálculos:

- Nos saltamos los dos primeros registros de 84 bytes cada uno: 2 * 84 = 
168 bytes.
- Nos saltamos los primeros 76 bytes = 4 + 64 + 4 + 4.
- Su suma es el desplazamiento total: 168 + 76 = 144 bytes.

Al realizar un cambio de posición de 144 bytes desde el comienzo del 
fichero, nuestro cursor del fichero se ubica al comienzo de la 
información que representa la cantidad de artículos en existencia 
(stock). Ahora podemos acceder a los 4 bytes que representan la cantidad 
guardada.

Si se trata de un fichero de texto y se guarda la información con 
diferentes longitudes, entonces no podemos acceder tan directamente. 
Asimismo, la modificación de la información puede conllevar a un cambio 
de longitud o tamaño de caracteres y por tanto estaríamos reemplazando 
la información que no queremos modificar, pero que existe 
consecutivamente a la que sí queremos modificar.

La solución es,
1. Copiar la información posterior,
2. Modificar la información que nos interesa, y
3. Volver a copiar la información posteriormente.

También podemos crear un nuevo fichero y realizar varias copias del 
fichero original; esto es,

1. Copiar del fichero original al nuevo toda la información hasta llegar 
a la información a modificar,
2. Copiar la nueva información que nos interesa al nuevo fichero, y
3. Copiar del fichero original al nuevo toda la información posterior a 
la modificación.


Espero que todo esto te oriente.

Steven





Más información sobre la lista de distribución Cconclase