OPERACIONES BASICAS CON FILES

Iniciado por ANTÓN RAMIREZ, 13 Diciembre 2010, 04:17 AM

0 Miembros y 1 Visitante están viendo este tema.

ANTÓN RAMIREZ

hola a todos gracias por tu consejo Sagrini en realidad quisiera pedirte si me puedes brindar material de como empezar en linux , estoy muy implementado en dev y quiero tocar otras opciones , bueno en esta oportunidad te dejo un code sobre operaciones con files , compilalo con el dev-c++ y presiona F9 si gusta para compilar rapido .

AQUI podras apreciar aparte de las operaciones basicas como insertar registros , eliminar registros , mostrar registros , un actualizar con punteros , metodos de ordenamiento por codigo y por nombre es novedoso estos metodos , tambien hay varias decoraciones implemente algoritmos para capturar cuadros y hora -fecha del sistema este proyecto me costo muxo , quiero compartirlo con ustedes , haber Sagrini si das tu visto bueno a mi proyecto y como dices apoyame para comenzar con Linux , eh echo de todo un poco de todos los temas en dev++ pero ya quiero variar , ok espero tu respuesta y seguir en contacto si gustas seria bueno obtener tu ms para intercambiar informacion bueno me despido espero que puedan apreciar mi proyecto :



ATTE : ANTON RAMIREZ , LEONARDO VLADIMIR  (ALUMNO UNI)


#include <windows.h>//para los message box
#include <iostream>
#include <stdio.h> // Operaciones de archivos
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <ctype.h> // Operaciones toupper/tolower
using namespace std;

struct CLIENTE
{
char Cod[5];
char Nombre[25];
char Direccion[28];
char Tipo;
char tel[10];

};
// Declaracion global de la variable "Registro" de tipo struct CLIENTE
struct CLIENTE Registro;

// Declaracion global de la variable "*F" (apuntador de tipo archivo)
FILE *F;

int MenuCLIENTE();
void IngresarRegCLIENTE(); // Denominado tambien rutina de Altas
void BuscarxCodCLIENTE(); // Denominado tambien rutina de Consultas
void ActualizacionxCodCLIENTE(); // Denominado tambien rutina de Modificaciones
void EliminacionLogicaxCodCLIENTE(); // Denominado tambien rutina de Baja Logica
void EliminacionFisicaxCodCLIENTE(); // Denominado tambien rutina de Baja Fisica
void MostrarRegCLIENTE();
void Encabezado1();
void Raya58();
void Raya60();
int Menu();
void ordenarxcod();
void ordenarxnom();
void cuadro(int i,int j,int k,int l);
int main()
{
int Opcion;
do
{
Opcion = MenuCLIENTE();
switch(Opcion)
{
case 1 : IngresarRegCLIENTE();
break;
case 2 : BuscarxCodCLIENTE();
break;
case 3 : ActualizacionxCodCLIENTE();
break;
case 4 : EliminacionLogicaxCodCLIENTE();
break;
case 5 : EliminacionFisicaxCodCLIENTE();
break;
case 6 : MostrarRegCLIENTE();
break;
case 7 : ordenarxcod();
break;
case 8 : ordenarxnom();
break;
}
}while(Opcion != 0);
system("pause");
MessageBox(NULL, "Adios Gracias Por Usar Este Programa", "Adios =(", MB_ICONINFORMATION | MB_OK | MB_SYSTEMMODAL);
return(0);
}

int MenuCLIENTE()
{
int i;
textbackground(BLUE);
do
{
system("cls");
cuadro(1,1,80,25);
cuadro(28,2,50,4);
textcolor(LIGHTGREEN);
/*cout << "\n\n\r A R C H I V O D E C L I E N T E S";
cout << "\n\n\r Archivos SECUENCIALES en Lenguaje C ";
textcolor(WHITE);
cout << "\n\n\n\r 1.- INGRESAR Registros";
cout << "\n\r 2.- BUSCAR por CODIGO";
cout << "\n\r 3.- ACTUALIZAR Datos por CODIGO";
cout << "\n\r 4.- Eliminacion LOGICA por CODIGO";
cout << "\n\r 5.- Eliminacion FISICA por CODIGO (defragmentar)";
cout << "\n\r 6.- MOSTRAR Registros";
cout << "\n\r 7.- ORDENAR Registro por CODIGO";
cout << "\n\r 8.- ORDENAR Registro por NOMBRE";
textcolor(LIGHTRED);
cout << "\n\r 0.- TERMINAR";*/
textcolor(WHITE);
gotoxy(30,3);
textcolor(LIGHTRED);
printf("ARCHIVO DE CLIENTES");
gotoxy(15,5);printf("0.- TERMINAR");
textcolor(LIGHTGREEN);
gotoxy(15,7);printf("1.- INGRESAR Registros");
gotoxy(15,9);printf("2.- BUSCAR Regsitros por CODIGO");
gotoxy(15,11);printf("3.- ACTUALIZAR Datos por CODIGO");
gotoxy(15,13);printf("4.- ELIMINACION LOGICA por CODIGO");
gotoxy(15,15);printf("5.- ELIMINACION FISICA (Defragmentar)");
gotoxy(15,17);printf("6.- MOSTRAR Registros");
gotoxy(15,19);printf("7.- ORDENAR Registros por CODIGO");
gotoxy(15,21);printf("8.- ORDENAR Registros por NOMBRE");
textcolor(LIGHTRED);
gotoxy(15,23);printf(" Escojer su Opcion---------------------> ");
textcolor(WHITE);
cin >> i;
}while(i<0 || i>8);
return(i);

}

void IngresarRegCLIENTE()
{
char Codigo[15];
system("cls");

cout << "\n\r INGRESAR REGISTROS DE CLIENTES";
// Intenta abrir el archivo CLIENTES.SEC en modo de lectura/escritura
F = fopen("Cliente.Sec","rb+");
if(F == NULL)
{
// Crea el archivo en caso de no existir
F = fopen("Cliente.Sec","wb");
}

cout << "\n\n\n\rCodigo ---------> ";getchar();
//gets(Codigo);
cin>>Codigo;
fread(&Registro,sizeof(Registro),1,F); // Lee el Registro, de tamano=sizeof(Registro) del archivo "F"
// Ciclo mientras no se encuentre el final del archivo
while(!feof(F))
{
if(strcmp(Registro.Cod, Codigo)== 0)
{
cout << "\n\n\n\rRegistro DUPLICADO ...!!!";
fclose(F);
getch();
return;
}
fread(&Registro,sizeof(Registro),1,F);
}

strcpy(Registro.Cod, Codigo);
cout << "\n\rNombre ----------> ";getchar();
gets(Registro.Nombre);
cout << "\n\rDireccion ---------> ";
gets(Registro.Direccion);
cout << "\n\rTelefono/celular ---> ";
gets(Registro.tel);
cout << "\n\rTipo--> ";
cin >> Registro.Tipo;

// Grabar el Registro completo
fwrite(&Registro, sizeof(Registro), 1, F);
fclose(F); // Cierra el archivo

cout << "\n\n\n\rCLIENTE registrado !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

void BuscarxCodCLIENTE()
{
//Numero de producto que desea consultar
char Codigo[15];
system("cls");

cout << "\n\rBUSCAR REGISTROS POR CODIGO DE CLIENTES";
// Intenta abrir el archivo CLIENTES.SEC, en modo de solo lectura
F = fopen("Cliente.Sec","rb");

if(F == NULL)
{
cout << "\n\n\n\rNo existe el archivo !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

cout << "\n\n\n\r Codigo ---------> "; getchar(); gets(Codigo);

// Lee el "Registro", de tamano=sizeof(Registro) del archivo "F"
fread(&Registro, sizeof(Registro), 1, F);

while(!feof(F))
{
if(strcmp(Registro.Cod, Codigo)==0)
{
Encabezado1();
printf("\n%-8s%-25s%-25s%12s %-5c",Registro.Cod,Registro.Nombre,Registro.Direccion, Registro.tel,Registro.Tipo);
Raya60();
getch();
return;
}
fread(&Registro, sizeof(Registro), 1, F);
}
cout << "\n\rNo se encuentra ese registro !!!\n";
fclose(F);
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

void ActualizacionxCodCLIENTE()
{
// Codigo de CLIENTE que desea modificar
char Codigo[15];
int op;
system("cls");

cout << "\n\rACTUALIZAR REGISTROS POR CODIGO DE CLIENTES";
// Intenta abrir el archivo CLIENTES.dat en modo de lectura/escritura
F = fopen("Cliente.Sec","rb+");
if(F == NULL) // Valida la existencia del archivo
{
cout << "\n\n\n\rNo existe el archivo !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

cout << "\n\n\n\rCodigo ---------> "; getchar(); gets(Codigo);
// Lee el "Registro", de tamano=sizeof(Registro) del archivo "F"
fread(&Registro, sizeof(Registro), 1, F);

while(!feof(F))
{
if(strcmp(Registro.Cod, Codigo)==0)
{
Encabezado1();
printf("\n%-8s%-25s%-25s%12s %-5c",Registro.Cod,Registro.Nombre,Registro.Direccion, Registro.tel,Registro.Tipo);
Raya60();
cout << "\n\n\n\r";
system("pause");
do
{
op = Menu();
switch(op)
{
case 1 : system("cls");
textcolor(LIGHTGREEN);
cout << "\n\n\r Actualizacion de Clientes";
textcolor(WHITE);
cout << "\n\n\n\rIngrese nuevo dato";
cout << "\n\rNombre ---------> "; getchar(); gets(Registro.Nombre);
system("cls");
break;
case 2 : system("cls");
textcolor(LIGHTGREEN);
cout << "\n\n\r Actualizacion de Clientes";
textcolor(WHITE);
cout << "\n\n\n\rIngrese nuevo dato";
cout << "\n\rDireccion --------> ";getchar(); gets(Registro.Direccion);
system("cls");
break;
case 3 : system("cls");
textcolor(LIGHTGREEN);
cout << "\n\n\r Actualizacion de Clientes";
textcolor(WHITE);
cout << "\n\n\n\rIngrese nuevo dato";
cout << "\n\rTipo--> "; cin >> Registro.Tipo;
system("cls");
break;

}
}while(op != 0);

/**Es necesario reposicionar el apuntador del archivo al principio del
* registro que desea modificar, ya que al leer un registro, el
* apuntador se posiciona en el registro siguiente
* La funcion ftell(F) devuelve la posicion donde se encuentra el
* apuntador
*/
fseek(F, ftell(F)-sizeof(Registro), SEEK_SET);
// Graba el registro con los nuevos campos
fwrite(&Registro, sizeof(Registro), 1, F);
fclose(F);
cout << "\n\n\n\rRegistro modificado !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}
fread(&Registro, sizeof(Registro), 1, F);
}
cout << "\n\rNo se encuentra ese registro !!!\n";
fclose(F);
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

void EliminacionLogicaxCodCLIENTE()
{
//numero de codigo que desea eliminar
char Codigo[15], op;
system("cls");

cout << "\n\rELIMINACION LOGICA DE REGISTROS DE CLIENTES";
F = fopen("Cliente.Sec","rb+");
if(F == NULL) // Checa la existencia del archivo
{
cout << "\n\n\n\rNo existe el archivo !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

cout << "\n\n\n\rCodigo --------> "; getchar(); gets(Codigo);

fread(&Registro, sizeof(Registro), 1, F);
while(!feof(F))
{
if(strcmp(Registro.Cod, Codigo)==0)
{
Encabezado1();
printf("\n%-8s%-25s%-25s%12s %-5c",Registro.Cod,Registro.Nombre,Registro.Direccion, Registro.tel,Registro.Tipo);
Raya60();

strcpy(Registro.Cod, "----");
strcpy(Registro.Nombre, "----");
strcpy(Registro.Direccion, "----");
Registro.Tipo = '0';
do {
cout << "\n\n\r¿... SEGURO que desea BORRARLO ...? [S/N] ---> ";
cin>>op;
op=toupper(op);
}while(op!='S' && op!='N');

if(op == 'S')
{
/** Es necesario reposicionar el apuntador del archivo al principio del
* registro que desea modificar, ya que al leer un registro, el
* apuntador se posiciona en el registro siguiente
* La funcion ftell(F) devuelve la posicion donde se encuentra el
* apuntador
*/
fseek(F, ftell(F)-sizeof(Registro), SEEK_SET);
fwrite(&Registro, sizeof(Registro), 1, F);
cout << "\n\n\n\rRegistro eliminado !!!\n";
}
fclose(F);
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}
fread(&Registro, sizeof(Registro), 1, F);
}
cout << "\n\rNo se encuentra ese registro !!!\n";
fclose(F); // Cierra el archivo
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

void EliminacionFisicaxCodCLIENTE()
{
//Variable para controlar el archivo temporal
FILE *Temporal;
system("cls");

cout << "\n\rELIMINACION FISICA DE REGISTROS DE CLIENTES";
// Intenta abrir el archivo CLIENTES.SEC en modo de solo lectura
F = fopen("Cliente.Sec","rb");
// Valida la existencia del archivo
if(F == NULL)
{
cout << "\n\n\n\rNo existe el archivo !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}
// Crea el archivo Temporal.Sec
Temporal = fopen("Temporal.Sec","wb");

fread(&Registro, sizeof(Registro), 1, F);
while(!feof(F))
{
if(strcmp(Registro.Cod, "----")!= 0)
// Graba el registro valido en el archivo temporal
fwrite(&Registro, sizeof(Registro), 1, Temporal);
//Lee el siguinete elemento del archivo
fread(&Registro, sizeof(Registro), 1, F);
}
//fcloseall(); // Cierra todos los archivos abiertos
fclose(F);
fclose(Temporal);
remove("Clientes.Sec"); //Elimina el archivo original
rename("Temporal.Sec", "Clientes.Sec");
//Renombra el archivo temporal con el nombre del archivo original

cout << "\n\n\n\rArchivo DEFRAGMENTADO ... !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

void MostrarRegCLIENTE()
{
system("cls");

cout << "\n\r\t\t\tLISTADO DE REGISTROS DE CLIENTES\n\n";
F = fopen("Cliente.Sec","rb");
if(F == NULL)
{
cout << "\n\n\n\rNo existe el archivo !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

Encabezado1();
fread(&Registro, sizeof(Registro), 1, F);
while(!feof(F))
{
printf("\n%-8s%-25s%-25s%12s %-5c",Registro.Cod,Registro.Nombre,Registro.Direccion, Registro.tel,Registro.Tipo);
fread(&Registro,sizeof(Registro),1,F);
}
fclose(F); // Cierra el archivo
Raya60();
cout << "\n\rFin del listado !!!\n";
cout << "\n\r<<< ... PRESIONE ENTER para continuar >>>";
getch();
return;
}

void Encabezado1()
{
Raya58();
cout << "\nCODIGO N O M B R E D I R E C C I O N TELEFONO TIPO";
Raya60();
}

void Raya58()
{
cout << "\n\r==============================================================================";
}

void Raya60()
{
cout << "\n\r------------------------------------------------------------------------------";
}

int Menu()
{
int i;
do
{
system("cls");
textcolor(LIGHTGREEN);
cout << "\n\n\r Actualizacion de Clientes";
textcolor(WHITE);
cout << "\n\n\n\r 1.- ACTUALIZAR Nombre";
cout << "\n\r 2.- ACTUALIZAR Direccion";
cout << "\n\r 3.- ACTUALIZAR Tipo";
textcolor(LIGHTRED);
cout << "\n\r 0.- TERMINAR";
textcolor(WHITE);

cout << "\n\n\n\r Seleccione su opcion ---> ";
cin >> i;
}while(i<0 || i>3);
return(i);
}
void ordenarxcod(){
FILE *F;
CLIENTE A,B,aux;
int i,j,n;
F=fopen("Cliente.Sec","rb+");
if(F==NULL){
printf("No se puede abrir el archivo.\n");
exit(1);
}
fseek(F,0,SEEK_END);
n=ftell(F)/sizeof(A);
for(i=0;i<=n-1;i++){
for(j=i+1;j<=n;j++){
fseek(F,i*sizeof(A),SEEK_SET);
fread(&A,sizeof(A),1,F);
fseek(F,j*sizeof(B),SEEK_SET);
fread(&B,sizeof(B),1,F);
if(strcmp(A.Cod,B.Cod)==1){
aux=A;
A=B;
B=aux;
fseek(F,i*sizeof(A),SEEK_SET);
fwrite(&A,sizeof(A),1,F);
fseek(F,j*sizeof(B),SEEK_SET);
fwrite(&B,sizeof(B),1,F);
}
}
}
MostrarRegCLIENTE();
}
void ordenarxnom(){
FILE *F;
CLIENTE A,B,aux;
int i,j,n;
F=fopen("Cliente.Sec","rb+");
if(F==NULL){
printf("No se puede abrir el archivo.\n");
exit(1);
}
fseek(F,0,SEEK_END);
n=ftell(F)/sizeof(A);
for(i=0;i<=n-1;i++){
for(j=i+1;j<=n;j++){
fseek(F,i*sizeof(A),SEEK_SET);
fread(&A,sizeof(A),1,F);
fseek(F,j*sizeof(B),SEEK_SET);
fread(&B,sizeof(B),1,F);
if(strcmp(A.Nombre,B.Nombre)==1){
aux=A;
A=B;
B=aux;
fseek(F,i*sizeof(A),SEEK_SET);
fwrite(&A,sizeof(A),1,F);
fseek(F,j*sizeof(B),SEEK_SET);
fwrite(&B,sizeof(B),1,F);
}
}
}
MostrarRegCLIENTE();
}
void cuadro(int i,int j,int k,int l){
register int a;
for(a=j+1;a<l;a++){
gotoxy(i,a);
printf("%c",186);
gotoxy(k,a);
printf("%c",186);
}
for(a=i+1;a<k;a++){
gotoxy(a,j);
printf("%c",205);
gotoxy(a,l);
printf("%c",205);
}
gotoxy(i,j);printf("%c",201);
gotoxy(k,j);printf("%c",187);
gotoxy(i,l);printf("%c",200);
gotoxy(k,l);printf("%c",188);
gotoxy(1,1);
}


Garfield07

Bueno, primero de nada, aunque creo que es de verdad por nada...
Luego, ese codigo para mi esta mucho mejor...

y aparte. El codigo C en linux es muy sencillo. Simplemente creo que de lo que sabes, quita las APIs que olvides, algunas librerias ya no existen en esta orilla, y los sockets son mucho mas faciles.
Usas Ubuntu? Recomiendo 9.04.
Sencillo. Lo mejor de Linux es su complicada sencillez.
Olvida Dev-Cpp. Es el peor compilador (opinion personal) del mundo. Si sigues programando en windows, Code-Brocks.
Luego, si no en linux hay un programa llamado "gedit". Aplicaciones>1º menu>Editor de textos gedit. Escribes y guardas como "code.c". Terminal (Aplicaciones>1º menu>Terminal. ), vas a la carpeta "cd Es*", y compilas (gcc -o code code.c).
Para probarlo, terminal, "./code" [el punto es la carpeta en la que estas. Es un metodo rapido de linux]

Creo que es excesivamente explicado...
Pregunta lo que quieras.
De nada otra vez (nada da mas alegria que alguien agradecido xD)


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo