[C con Clase] Buenos Dias

Steven Davidson srd4121 en njit.edu
Mie Jul 28 02:07:43 CEST 2010


Hola Gilberto,

Gilberto Sanchez wrote:
> steven 10 ptos a tu respuesta! Pero Ahora ya hize todo eso ya me
> agrega fino pero ahora me eh topado con un paroblema mayor QUE
> FORMATO es el mejor para grabar datos la verdad todos se entremezclan
> como hago para restringir cada campo,
> 
> 1.- Que no se Mezclen
> 2.- Que no se pase la informacion de uno para el otro
> 3.- Que no le caiga informacion que nisiquiera eh metido 
> 
> La verdad Esto de Manejar Fichero TREMENDO LIO XD! la verdad de aqui
> voya  salir master en fichero si lo llego a lograr ahcer ala
> perfeccion y STEVEN gracias la verdad me ayuda en mucho tus
> comentarios con respecto a la logica de modificacion yo lo tenia en
> mente igual Pero para poder hacer necesito hacer lo que mencione
> horita anteriormente RESTRINGIR LOS CAMPO de manera qeu cada uno se
> dependiente de si que no le entre informacion de otros campos y/o
> basura tal vez eso es un manejo efectivo de fichero cosa que yo
> actualmente carezco si me pueden guiar me serviria de mucho! Mas que
> nada con un ejemplo que estructure bien mas de 4 datos seria
> excelente!
> 
> 

Bien. Quiero dejar claro que la información presentada al usuario y 
manipulada por él es diferente a la organización de tal información en 
un fichero de texto.

Por lo que entiendo, ahora tienes un problema al guardar la información, 
posiblemente modificada por el usuario, en el mismo fichero de texto que 
ya contenía la información original. El problema es que no puedes 
modificar un campo en el fichero, porque el fichero no se organiza por 
campos. Desde el punto de vista del fichero de texto, la información se 
guarda como una serie de caracteres contiguos. Por ejemplo,
digamos que definimos y usamos la siguiente estructura en nuestro programa:

struct Persona
{
   char nombre[20];
   char apellidos[50];
   unsigned short int edad;
};

Y luego definimos unas variables de este tipo:

Persona per1 = { "Pablo", "Dominguez de la Torre", 31 };
Persona per2 = { "Guillermo", "Jimenez Aguirre", 20 };
Persona per3 = { "Cristina", "Fernandez de la Sierra", 9 };

Si guardamos esta información como texto en un fichero, obtenemos el 
siguiente contenido de tal fichero:

Pablo;Dominguez de la Torre;31\nGuillermo;Jimenez 
Aguirre;20\nCristina;Fernandez de la Sierra;9\n<EOF>

Aquí <EOF> significa el fin del fichero. He usado el punto y coma para 
distinguir entre cada campo y '\n' para separar cada registro. Sin 
embargo, hay que tener en cuenta que todos los caracteres existen 
seguidos en un fichero.

Posteriormente, alguien modifica uno de los campos de uno de los 
registros. Digamos que el primer registro va a ser modificado para que 
ahora sea:

Pedro;Viciana Sanchez;9\n

Al escribir esta información en el fichero, acabaremos con lo siguiente:

Pedro;Viciana Sanchez;9\nre;31\nGuillermo;Jimenez 
Aguirre;20\nCristina;Fernandez de la Sierra;9\n<EOF>

Como puedes ver, los registros no son mudados ni completamente 
reemplazados. Esto es porque el comportamiento del fichero carece de 
este tipo de organización. Simplemente, las operaciones del fichero leen 
y escriben datos a partir de una posición en particular.

El otro problema es que cada registro en el fichero puede contener una 
cantidad variable de caracteres, por lo que no siempre podemos 
reemplazar cada registro con otro de una longitud diferente. Esto es lo 
que ocurrió en el ejemplo anterior. El nuevo registro es de una longitud 
menor que el registro orginal y por tanto sobran algunos caracteres finales.

Existen dos posibles soluciones:
1. Construye otro fichero auxiliar. Copia todos los registros anteriores 
al registro a reemplazar a este nuevo fichero. Escribe el nuevo registro 
en el nuevo fichero. Copia todos los registros posteriores al registro a 
reemplazar al fichero auxiliar. Ahora que tienes la información guardada 
en otro fichero, tal y como lo quieres, puedes borrar el fichero 
original y renombrar este nuevo fichero auxiliar con el nombre del 
fichero original.

2. Guarda todos los registros en memoria, con todas las modificaciones. 
Elimina el fichero original y vuelve a crearlo, para guardar toda la 
información en memoria al fichero.

3. No uses ficheros de texto, sino binarios. Con este tipo de ficheros, 
puedes fijar la longitud de cada registro. Al tener un registro de 
cantidad fija, cualquier modificación del registro será un reemplazo 
exacto, sin que sobren caracteres y sin sobreescribir los caracteres de 
otros registros.

Sugiero que consultes el curso del manejo de archivos si quieres conocer 
otras estrategias acerca de este tema. El enlace es: 
http://c.conclase.net/ficheros/index.php


Espero que esto te oriente.

Steven





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