Viernes 8 de Noviembre de 2024, 15:47
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Parametros genericos....
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Parametros genericos.... (Leído 2868 veces)
Luciano9
Miembro activo
Mensajes: 25
Parametros genericos....
«
en:
Viernes 8 de Mayo de 2009, 21:04 »
0
&ArchHola, antes que nada me presento. Me llamo Luciano, estudio Analisis de Sistemas y soy nuevo en el foro.
Tengo una duda sobre lo siguiente:
Estoy haciendo 1 proyecto que maneja archivos.
Tengo varios cpps con sus respectivos .h de los cuales uno se llama "ARCH.CPP" y tiene su "ARCH.H".
Estos tienen las funciones básicas de archivos (grabar, leer, abrir, cerrar) pero de forma más genérica: "AbrirArchivo(parametros), en lugar de fopen = (parametros)".
El proyecto necesita grabar 2 archivos, cada uno de una estructura diferente.
Lo que necesito es saber como hacer esta libreria arch.h genérica para aceptar cualquiera de las dos estructuras que le mande por parámetro.
(No puedo usar un #define TIPODATOARCHIVO ty_miregistro porque tengo 2 registros...)
Tampoco estoy familiarizado con el uso de punteros ni objetos.
ARCH.h
Código: Text
#ifndef __ARCH_H
#define __ARCH_H
//Librerias
#include <stdio.h>
#include "TDARCH.h"
//Prototipos
void AbrirArchivo (FILE * &Arch, bool &bPudo, char * dir, char tipo); //Procedimiento de apertura de archivos de Entrada y de Salida
void LeerArchivo (FILE * &Arch, ty_TDArch &Reg, bool &bFin); //Procedimiento de lectura de archivo
void GrabarArchivo (FILE * &Arch, ty_TDArch &Reg); //Procedimiento de guardado de archivo
void CerrarArchivo (FILE * &Arch); //Procedimiento de cerrado de archivo
#endif /*__ARCH_H*/
ARCH.cpp
Código: Text
//Librerias
#include "ARCH.h"
#include <iostream.h>
////////////////////////////////////////////////////////////////////////////////////////////
//Rutina LeerArchivo (FILE * &Arch, ESTRUCT &estructura, bool &bfin)
////////////////////////////////////////////////////////////////////////////////////////////
void LeerArchivo (FILE * &Arch, ty_TDArch &Reg, bool &bFin)
//Rutina para leer un Archivo
{
if (!(feof(Arch))) { //Si no es fin de archivo
fread (&Reg, sizeof(ty_TDArch),1,Arch); //Leo el archivo
bFin = FALSE; //No termino la lectura, porque lo lei
} else { //Caso contrario, Termino la lectura
bFin = TRUE;
}
}
//Fin de Rutina - LeerArchivo (FILE * &Arch, ESTRUCT &estructura, bool &bfin) -
////////////////////////////////////////////////////////////////////////////////////////////
//Rutina - AbrirArchivo (FILE*Arch,bool&bPudo,char*dir,char tipo) -
////////////////////////////////////////////////////////////////////////////////////////////
void AbrirArchivo (FILE * , bool &bPudo, char * dir, char tipo)
//Rutina para abrir un archivo de Entrada o de Salida
{
if (tipo == 'E') { //Si el tipo de archivo es de Entrada
Arch=fopen (dir,"rt"); //Abro el archivo de entrada
if (Arch == NULL) { //Si no encuentra el archivo
cout << "No se pudo abrir el archivo de Entradan";
bPudo=FALSE; //bPudo Abrirlo es FALSO
}else{
bPudo=TRUE; //Caso contrario bPudo Abrirlo es VERDADERO
}
} else { //Caso contrario el archivo es de Salida
Arch=fopen (dir,"a+"); //Abro el archivo de salida
if (Arch == NULL) { //Si no encuentra el archivo
cout << "No se pudo abrir el archivo de Salidan";
bPudo=FALSE; //bPudo Abrirlo es FALSO
}else{
bPudo=TRUE; //Caso contrario bPudo Abrirlo es //VERDADERO
}
}
}
//Fin de Rutina - AbrirArchivo (FILE*Arch,bool&bPudo,char*dir,char tipo) -
////////////////////////////////////////////////////////////////////////////////////////////
//Rutina - GrabarArchivo1 (FILE*Arch,ESTRUCT &estructura) -
////////////////////////////////////////////////////////////////////////////////////////////
void GrabarArchivo1 (FILE * &Arch, ty_TDArch &Reg)
{ //Rutina para grabar un archivo
fwrite (&Reg, sizeof(ty_TDArch),1,Arch); //Graba el archivo
}
//Fin de Rutina - GrabarArchivo (FILE*Arch,ESTRUCT &estructura) -
////////////////////////////////////////////////////////////////////////////////////////////
//Rutina - CerrarArchivo (FILE * &Arch)
////////////////////////////////////////////////////////////////////////////////////////////
void CerrarArchivo (FILE * &Arch)
{ //Rutina para cerrar un archivo
fclose(Arch); //Cierra el archivo
}
//Fin de Rutina - CerrarArchivo (FILE * &Arch)
La idea de esta libreria propia, es que esté encapsulada. Para acceder a los datos de ella, pense hacer un TDARCH.h que la maneje, de esta forma no tendria que romper el encapsulamiento cada vez que quiera cambiar algo.
TDARCH.h
Código: Text
#include "STRCTP3.h"
#define FALSE 0
#define TRUE (1 == 1)
typedef int bool;
Ahora bien, tengo 2 registros que contienen lo siguiente:
STRCTP3.H
Código: Text
typedef struct ty_RegOrig{
ty_VecV VecV;
ty_VecVB VecVB;
}; //estructura para registro de archivo vectores originales
typedef struct ty_RegResult{
ty_VecResB VecResBOrd;
ty_VecResB VecResBDes;
ty_VecResB VecResBBin;
ty_VecReO VecResOrd;
}; //estructura para registro de archivo vectores de resultados
Estos 2 registros tengo que guardarlos en 2 archivos diferentes utilizando el mismo procedimiento de guardar. Y ahí está el problema, los tipos de dato son diferentes.
Si alguien me puede explicar como hacer para pasarle directamente una posicion de memoria para que lea "X" tamaño, indiferentemente del tipo, le agradezco mucho.
Espero que se entienda, me cuesta 1 poco explicar esto por acá.
Muchas gracias de antemano.
Saludos.
Tweet
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Parametros genericos....
«
Respuesta #1 en:
Viernes 8 de Mayo de 2009, 21:31 »
0
¿¿Queres leer/escribir buffers??
Pasa a la funcion que graba un char * (haces casting para pasarle lo que sea) y el tamaño total (de la estructura que queres grabar). Es lo que hacen fread/fwrite al fin y al cabo
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Luciano9
Miembro activo
Mensajes: 25
Re: Parametros genericos....
«
Respuesta #2 en:
Viernes 8 de Mayo de 2009, 21:40 »
0
Te agradezco la respuesta, pero soy bastante novato en el tema...
Lo que entendí hasta ahora es esto:
Yo tendría que pasarle a mi rutina "genérica" de grabar, un puntero a la posicion de memoria donde empiece mi registro... supongo que será un void * reg... algo asi.
Despues tengo que pasarle el sizeof(miregistro), la cantidad de veces q graba y el archivo con la estructura FILE.
en stdio.h está el encabezado del fwrite como
Código: Text
unsigned fwrite(const void *__ptr, size_t __size_t, size_t __size_n, FILE * __stream);
Esto es totalmente generico, porque siendo REG o REGASDAD o REGISTROASD o lo que le pase, va a funcionar.
Lo que quiero saber es como implementarlo en mi rutina (que en definitiva es la misma pero con mis propios nombres)
gracias.
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Parametros genericos....
«
Respuesta #3 en:
Viernes 8 de Mayo de 2009, 21:50 »
0
Código: Text
void GrabarArchivo1 (FILE *Arch, void *buffer, unsigned int bufferLen)
{
fwrite (buffer , 1, bufferLen , Arch);
}
Entonces si queres grabar esta estructura ty_RegResult por ejemplo haces asi:
Código: Text
FILE *Arch; //no ponemos aca como abrimos el archivo, no interesa
ty_RegResult var; //lo mismo para como inicializamos la estructura
GrabarArchivo1(Arch, (void*)var, sizeof(ty_RegResult));
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Luciano9
Miembro activo
Mensajes: 25
Re: Parametros genericos....
«
Respuesta #4 en:
Viernes 8 de Mayo de 2009, 22:17 »
0
gracias, era eso lo q necesitaba...
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Parametros genericos....
«
Respuesta #5 en:
Viernes 8 de Mayo de 2009, 22:26 »
0
De nadas
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
fachamix
Miembro MUY activo
Mensajes: 173
Nacionalidad:
Re: Parametros genericos....
«
Respuesta #6 en:
Viernes 8 de Mayo de 2009, 22:44 »
0
muy buen aporte, genial.
La muerte vive celosa, de mi amada flor la vida. Dicen que me anda buscando, ojala si un dia me pilla. Me alle MACHAO Y CANTANDO PA QUE SE MUERA DE ENVIDIA
Luciano9
Miembro activo
Mensajes: 25
Re: Parametros genericos....
«
Respuesta #7 en:
Sábado 9 de Mayo de 2009, 00:30 »
0
El grabar me anduvo PERFECTO.. hice un programa de prueba pero tengo inconvenientes al leer...
PRUEBA.CPP
Código: C++
#define FLASE 0
#define TRUE (1==1)
typedef
struct
ty_strct
{
int
num
;
char
letra
;
typedef
int
bool
;
}
;
void
main
(
)
ty_strct strct, strct2
;
FILE
*
Arch
;
FILE
*
Arch2
;
bool
bFin, bPudo
;
clrscr
(
)
;
strct.
num
=
97
;
strct.
letra
=
'A'
;
AbrirArchivo
(
Arch,bPudo,
"C:\PRUEBA.DAT"
,
'S'
)
;
cout
<<
strct.
num
<<
endl
;
cout
<<
strct.
letra
<<
endl
;
cout
<<
"Pulse una tecla para grabar..."
;
getch
(
)
;
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
GrabarArchivo
(
Arch,
(
void
*
)
&
strct,
sizeof
(
ty_strct
)
)
;
cout
<<
"grabado ok"
;
}
CerrarArchivo
(
Arch
)
;
AbrirArchivo
(
Arch2,bPudo,
"C:\PRUEBA.DAT"
,
'E'
)
;
cout
<<
"Pulse una tecla para leer el archivo"
<<
endl
;
getch
(
)
;
do
{
LeerArchivo
(
Arch2,
(
void
*
)
&
strct2,
sizeof
(
ty_strct
)
,bFin
)
;
cout
<<
"Archivo cargado "
<<
endl
;
}
while
(
bFin
==
FALSE
)
;
CerrarArchivo
(
Arch2
)
;
cout
<<
"Fin de carga"
<<
endl
;
getch
(
)
;
}
RUTINA DE GRABAR:
Código: C++
void
GrabarArchivo
(
FILE
*
Arch,
void
*
Reg,
unsigned
int
tam
)
{
"
fwrite (Reg,tam,1,Arch);
}
RUTINA DE LEER:
Código: C++
void
LeerArchivo
(
FILE
*
Arch,
void
*
Reg,
unsigned
int
tam,
bool
&
bFin
)
{
if
(
!
(
feof
(
Arch
)
)
)
{
fread
(
Reg,tam,
1
,Arch
)
;
bFin
==
FALSE
;
}
else
{
bFin
==
TRUE
;
}
}
------------------------
El problema es este:
1) ABRO EL ARCHIVO DE SALIDA.
2) GRABO A97 DOS VECES EN EL ARCHIVO
3) CIERRO EL ARCHIVO
4) ABRO EL ARCHIVO DE ENTRADA
5) LEO EL ARCHIVO HASTA Q SEA EL FIN DEL MISMO
**** LEE 4 REGISTROS Y YO GUARDE 2*****
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Parametros genericos....
«
Respuesta #8 en:
Sábado 9 de Mayo de 2009, 12:17 »
0
Depuralo; sino deja una version compilable.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Luciano9
Miembro activo
Mensajes: 25
Re: Parametros genericos....
«
Respuesta #9 en:
Domingo 10 de Mayo de 2009, 00:47 »
0
Ya lo solucione... era un temita del while !bFin.
Yo grabo 1 archivo. Quiero que el archivo al leerlo, lea Todos los registros que le grabe. Luego voy a grabar otro registro abajo del registro grabado en el archivo.
Voy a abrir el programa y leer el archivo devuelta, y necesito
Que me leea TODOS los registros y no sólo uno
.
¿En qué modo tengo que grabar?..
gracias por todas las respuestas.
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Parametros genericos....
«
Respuesta #10 en:
Domingo 10 de Mayo de 2009, 10:03 »
0
Abrilo en modo binario, mira
fopen
.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Luciano9
Miembro activo
Mensajes: 25
Re: Parametros genericos....
«
Respuesta #11 en:
Domingo 10 de Mayo de 2009, 16:38 »
0
Abro el archivo de salida en modo a+b (el ejercicio lo pidio en append)
Leo el archivo
while(!FIn){
leo el archivo
Muestro el registro leido
getch();
}
Cierro archivo...
Lo curioso es que me lee el último registro..
La verdad ya no se que probar, voy a tener q entregarlo asi XD
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Parametros genericos....
«
Respuesta #12 en:
Domingo 10 de Mayo de 2009, 17:25 »
0
a+b deberia estar bien: "Open a file for reading and appending. All writing operations are performed at the end of the file, protecting the previous content to be overwritten. You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist."
Cualquier cosa usa fseek para ponerte al principio ...
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Luciano9
Miembro activo
Mensajes: 25
Re: Parametros genericos....
«
Respuesta #13 en:
Domingo 10 de Mayo de 2009, 19:14 »
0
Gracias por la ayuda..
Te soy sincero, estuve toda la mañana tratando de implementar esto pero no me sale.
En pocas palabras lo que pense es esto:
Antes de leer el archivo, voy a tener que posicionarme en el inicio del archivo. Así cuando lea, voy a poder leer desde el inicio hasta que termine el archivo.
Ahora bien, hay una funcion que me dijiste que se llama fseek la cual, supuestamente, me permite retroceder pasandole el Arch, el offset y el whence (SEEK_...)
Pero también lei que hay otras como ftell y rewind...
No se cómo aplicar este código a mi razonamiento.
Si me podes dar una mano a nivel codigo, te agradezco.
...
1) AbroArchivodeEntrada(RESULT.....)
2) Vuelvoelpunteroalinicio(....)
3)Leo el archivo
4)Mientras !Fin
5)LEo el archivo
gracias ...
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Parametros genericos....
«
Respuesta #14 en:
Domingo 10 de Mayo de 2009, 19:37 »
0
ftell es para obtener la posicion en la que se encuentra el stream.
rewind
, que jamas use, lleva el stream al comienzo del archivo asi que es justamente lo que queres.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Parametros genericos....