UNIDAD 5: REGISTROS Y ARCHIVOS SECUENCIAL

TEMA LINUX GCC 11: EDICION DE REGISTROS

Modificar o editar un registro es uno de los procesos mas comunes con archivos en disco, generalmente despues de un fuerte proceso de captura de registros, una revisión o consulta general muestra muchos de ellos con errores de captura.

El modelo de programación cliente-servidor que se está estudiando, facilita mucho este proceso de edición.

Para este proceso se ocupara una forma html y se ocuparan 2 PROGRAMAS CPP-CGI, el procedimiento a seguir es:

1.- la forma html pide la clave del registro a editar.

2.- el primer programa cpp-cgi es el programa normal de busqueda que ya se construyo en temas anteriores, pero al desplegar el registro se debera construir una forma html completa (llamada forma o pagina dinamica) que incluya los textboxs cargados con los datos del registro y con el form action apuntando al segundo programa cpp-cgi, observar que en general este programa lo que hace es construir una segunda forma html con los datos cargados del registro.

3.- el segundo programa cpp-cgi es activado y toma los datos de la forma dinamica , los almacena en un registro temporal que va comparando contra el registro original que se va leyendo del archivo original y cuando la clave del registro original y la clave de registro temporal coinciden, entonces es el registro temporal quien se almacena o graba en el archivo temporal.

Observar que en este programa es la primera vez que se usan dos registros(original y temporal) y tambien dos archivos(original y temporal).

Prog25.html

<HTML>
<FORM ACTION=/~tusitio/cgi-bin/prog25.cgi METHOD=post>
CLAVE A EDITAR:<INPUT TYPE=text NAME=CLAVE><BR>
<INPUT TYPE=submit VALUE=BUSCAR>
</FORM></HTML>

corrida prog 20 archivo original:

image82.jpg

corrida prog25.html

image83.jpg

vamos a editar el segundo registro.

Prog25.cpp

#include <string>
#include <iostream>
#include <lcnet.h>
using namespace std;
static struct {
int clave;
char nombre[30];
float peso;
} alumno;
int main() {
// cargando clave a editar
int clave=getinteger("CLAVE");
FILE *archdisco;
archdisco = fopen("//home//tusitio//alumnos.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)
{
// buscando y cargando y abandonando while con la estructura deseada
if ( clave == alumno.clave) break;
}; // aqui termina while
// no olvidar cerrar archivo y siempre fuera de while
fclose(archdisco);
//mandando registro y nueva forma a usuario
cout << "Content-type: text/html\n\n";
cout << "<html>" << endl;
cout << " <FORM ACTION=/~tusitio/cgi-bin/prog26.cgi METHOD=post>" << endl;
cout<< "CLAVE:<INPUT TYPE=text NAME=CLAVE VALUE=" << alumno.clave << ">" << "<br>" <<endl;
cout<< "NOMBRE:<INPUT TYPE=text NAME=NOMBRE VALUE=" << alumno.nombre << ">" << "<br>" <<endl;
cout<< "PESO:<INPUT TYPE=TEXT NAME=PESO VALUE=" << alumno.peso << ">" << "<br>"<< endl;
cout<< "<INPUT TYPE=SUBMIT VALUE=MODIFICAR>" <<endl;
cout << "</html>" << endl;
return 0;
}

Observar que es el programa normal de busqueda pero el despliegue se realiza construyendo una pagina o forma dinamica como se observa en la siguente corrida:

image84.jpg

OOPS parece que al construir la forma dinamica el espacio en blanco dentro de una string se perdio van a tener que corregir este problema de tarea, pero en fin la forma dinamica sale ya cargada.

Prog26.cpp

#include <string>
#include <iostream>
#include <lcnet.h>
using namespace std;
static struct {
int clave;
char nombre[30];
float peso;
} alumno;
static struct {
int clave;
char nombre[30];
float peso;
} regtemp;
int main() {
//cargando registro editado
regtemp.clave=getinteger("CLAVE");
string temporal =getstring("NOMBRE");
strcpy( regtemp.nombre, temporal.c_str() );
regtemp.peso=getfloat("PESO");
FILE *arch1;
FILE *arch2;
arch1 = fopen("//home//tusitio//alumnos.dat","r+");
arch2 = fopen("//home//tusitio//temporal.dat","at+");
// aqui siempre debe empezar el ciclo de lectura
// y fread() regresa siempre cuantas estructuras leyo
while(fread(&alumno,sizeof(alumno),1,arch1)==1)
{
if ( regtemp.clave != alumno.clave) fwrite(&alumno,sizeof(alumno),1,arch2);
if ( regtemp.clave == alumno.clave) fwrite(&regtemp,sizeof(regtemp),1,arch2);
}; // aqui termina while
//cerrando archivos
fclose(arch1);
fclose(arch2);
// removiendo y renombrando archivos
remove("//home//tusitio//alumnos.dat");
rename("//home//tusitio//temporal.dat","//home//tusitio//alumnos.dat");
//avisando
cout << "Content-type: text/html\n\n";
cout << "<html>" << endl;
cout << " registro editado"<<endl;
cout << "</html>" << endl;
return 0;
}

Este es el programa que activa la forma dinamica y que actualiza el registro editado en el archivo en disco, la logica de este programa ya se explico en el tercer parrafo de este tema.

Corrida prog20 para ver como quedo el archivo con el registro ya editado.

image85.jpg

TAREAS PROGRAMACION LINUX GCC PROGRAMACION LINUX GCC

CONSTRUIRLES PROGRAMAS DE EDICION O MODIFICACION A LOS ARCHIVOS YA CONSTRUIDOS.

Politica de Privacidad