martes, julio 28, 2009

Vuelta al cole...

IMPORTANTE!!!

La rectora de la escuela, me comunicó hoy que las clases comienzan el lunes 3 de agosto, pasando las mesas de examen del 3 y 4 de agosto al 10 y 11 de agosto.

Así que nos vemos en clase...

miércoles, julio 22, 2009

Tarjeta de referencia de ANSI C

Encontré un buen machete de funciones y complementos para ANSI C.

Laboratorio II - Archivos

En esta entrada voy a explicar una forma posible de resolver parte de la evaluación, que en general fué similar para todos los grupos.

En principio, se trataba de leer datos desde un archivo de texto plano, donde cada línea representa los datos de un cliente, indicado por:

NOMBRE; DOMICILIO; TELÉFONO; LOCALIDAD


Para poder realizar esta operación es necesario abrir el archivo para lectura, y utilizar una función para la adquisición de los datos que me asegure leer la línea completa, dado que me voy a encontrar con muchos elementos que actúan de separador o limitador de campo. Entonces lo que más práctico me parece utilizar es la función FGETS(), que me permite leer de un archivo la cantidad de caracteres que le indique.

...

FILE *pfTxt;
char *linea;

pfTxt = fopen("demo.txt", "r");
linea = malloc(sizeof(char) * 100);


while(!feof(pfTxt)) {

memset(linea, '\0', 100);
fgets(linea, 100, pfTxt);


...
}


Estas líneas de código nos permite ir leyendo línea a línea el archivo hasta el final.

Luego que tenemos en una variable, la cadena de caracteres que corresponde a los datos de un cliente, se nos pide separar los mismos en un registro. Para este ejemplo, solo voy a separarlos por las datos principales, Nombre, Domicilio, Teléfono y Localidad.

Se debe entonces crear un nuevo tipo de datos al que voy a llamar ABONADO

typedef struct {
char ayn[30];
char dom[30];
char tel[20];
char loc[30];
} ABONADO;

Y la rutina que va a separar los datos es la siguiente:


Donde "lin" es una variable puntero a caracter que contiene la línea de datos leída del archivo.

Ahora solo resta almacenar el contenido de nuestra variable de registro "cliente" en un archivo binario...

fseek(pfBin, 0L, SEEK_END);
fwrite(&cliente, sizeof(ABONADO), 1, pfBin);

... donde "pfBin" es una variable puntero a FILE, que debió asignarse de la siguiente forma:

FILE *pfBin = fopen("demo.dat","wb");


Uniendo todo esto en dos funciones "void pasaTxtBin()", encargada de leer el archivo de texto y generar el archivo binario y la función "ABONADO separaLineaEnCampos(char *)" que recibe una cadena de caracteres que contiene la línea leída del archivo de texto y devuelve un registro...


En este link dejo el código con el ejemplo completo.

Algunas Fotitos