UNIDAD 5: REGISTROS Y ARCHIVOS SECUENCIALES

TEMA LINUX GCC 6: GRABACION Y LECTURA DISCO

Como ya se menciono grabar y lectura de registros o estructuras a renglones o registros de archivos en disco.

Estos dos procesos son los casos mas comunes y frecuentes que se pueden realizar con un archivo de disco.

GRABACION DE UNA ESTRUCTURA A UN ARCHIVO EN DISCO

Prog19.html

<HTML>
<FORM ACTION=/~lauro/cgi-bin/prog19.cgi METHOD=post>
CLAVE:<INPUT TYPE=text NAME=CLAVE><BR>
NOMBRE:<INPUT TYPE=text NAME=NOMBRE><BR>
PESO:<INPUT TYPE=TEXT NAME=PESO><BR>
<INPUT TYPE=submit VALUE=OK>
</FORM></HTML>

corrida:

image68.jpg

prog19.cpp

#include <string>
#include <iostream>
#include <lcnet.h>
using namespace std;
static struct {
int clave;
char nombre[30];
float peso;
} alumno;
int main() {
//cargando estructura
alumno.clave=getinteger("CLAVE");
// y se debe almacenar la string como un arreglo de chars de ahí la
// necesidad de un temporal
string temp =getstring("NOMBRE");
strcpy( alumno.nombre, temp.c_str() );
// observar la función .c_str(); para convertir string a chars
alumno.peso=getfloat("PESO");
//abiendo, grabando, cerrando
FILE *archdisco;
archdisco = fopen("//home//lauro//alumnos.dat","at+");
fwrite(&alumno,sizeof(alumno),1,archdisco);
fclose(archdisco);
//avisando usuario
cout << "Content-type: text/html\n\n";
cout << "<html>" << endl;
cout << alumno.clave <<" "<<alumno.nombre<<" "<<alumno.peso<<endl;
cout << "<br>" << "registro grabado" <<endl;
cout << "</html>" << endl;
}

image69.jpg

La primera observación es que se esta usando el “fopen()” en modo “at+” en lugar de modo “w” pero es para matar dos pajaros de un tiro, reestudiar la clase anterior de modos de apertura.

La unica instrución nueva es:

fwrite(&persona,sizeof(persona),1,archdisco);

Como se observa ocupa 4 parametros que son:

Con apuntadores se manejan dos operadores diferentes que son ( * y &) el asterisco como ya se indico se usa para crear una variable apuntador, es decir variables que almacenaran direcciónes fisicas de algun lugar de la memoria del computador.

Por supuesto tambien que en ese espacio o bodega en memoria se almacenaran datos o información, es el operador &(ampersand) quien se usa para accesar a esos datos, ejemplo:

Float *pi; aqui se crea una variable apuntador que guardara la dirección donde se almacenara un valor de tipo float. Si en ese programa, se usa: pi= 3.1416, el compilador protesta, porque se esta pretendiendo almacenar un valor float en una variable que solo puede almacenar direcciones de memoria. Pero si es valido &pi=3.1416, es decir cuando usamos el operador ampersand estamos trabajando con el contenido de una dirección de memoria, es por eso que: 1.-PRIMER PARAMETRO: fwrite() ocupa primero conocer cuales datos va a almacenar en disco, aqui se le esta indicando que es el dato que se tiene en la direccion de memoria donde esta el registro “alumno”. 2.- SEGUNDO PARAMETRO: fwrite(), ocupa conocer cuantos bytes de información debe grabar, para esto se tienen dos opciones o se le da el valor exacto por ejemplo 64 bytes o 39 bytes o mas facil aun se usa sizeof() que regresa el tamaño del dato. 3.- TERCER PARAMETRO: fwrite(), necesita conocer tambien cuantas estructuras o registros a la vez debe grabar por lo general es un solo registro, pero mas adelante estudiaran que es posible grabar mas de un registro a la vez y esto es de mucho provecho, porque por ejemplo si en un sisTEMA LINUX GCC se ocupa grabar 1000 registros y usamos fwrite() de uno en uno, quiere decir que habría mil accesos a disco. 4.-CUARTO PARAMETRO: fwrite() tambien ocupa conocer exactamente en que cluster, sector y byte exacto del disco duro debe grabar el registro, la primera opción seria desarmar el disco duro y ver donde hay lugar para poner el archivo J o mejor aun usar la variable archdisco que ya tiene esa dirección fisica del archivo en disco. LECTURA DE REGISTROS Prog20.html <code> <HTML> <FORM ACTION=/~lauro/cgi-bin/prog20.cgi METHOD=post> <INPUT TYPE=submit VALUE=LEER> </FORM></HTML> </code> corrida: image70.jpg prog20.CPP <code> #include <string> #include <iostream> #include <lcnet.h> using namespace std; static struct { int clave; char nombre[30]; float peso; } alumno; int main() { cout « “Content-type: text/html\n\n”; cout « ”<html>” « endl; abriendo, leyendo,cargando estructura

FILE *archdisco;

archdisco = fopen(”homelauroalumnos.dat”,”r+”); aqui siempre debe empezar el ciclo de lectura

y fread() regresa siempre cuantas estructuras leyo while(fread(&alumno,sizeof(alumno),1,archdisco)==1) { desplegando estructuras

cout « alumno.clave «” ”«alumno.nombre«” ”«alumno.peso«endl;

cout « ”<br>” «endl;

}; aqui termina while no olvidar cerrar archivo y siempre fuera de while

tampoco olvidar cerrar la pagina fclose(archdisco); cout « ”</html>” « endl; return 0; } </code> image71.jpg Las unicas notas son : En fopen() se uso modo “r+”. En lugar de fwrite(), se usa fread() con los mismos cuatro parametros. Y seria bueno que el despliegue fuese en una tabla html pero esto queda de tarea. TAREAS PROGRAMACION LINUX GCC PROGRAMACION LINUX GCC 1.-crear, cargar y leer un archivo de productos y otro de empleados

Politica de Privacidad