Foros del Web » Programación para mayores de 30 ;) » C/C++ »

alta ordenada en ficheros

Estas en el tema de alta ordenada en ficheros en el foro de C/C++ en Foros del Web. hola wenas, estoy intentando hacer un programa en c++(mi proyecto), y no se como hacer las altas ordenadas. he estado mirando el foro, pero no ...
  #1 (permalink)  
Antiguo 04/06/2008, 05:42
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 15 años, 11 meses
Puntos: 0
Información alta ordenada en ficheros

hola wenas,
estoy intentando hacer un programa en c++(mi proyecto), y no se como hacer las altas ordenadas.
he estado mirando el foro, pero no he encontrado nada, lo unico que encontre, estaba con otras librerias y no me sirve, jeje, la profesora, que cree que solo se puede hacer como ella dice, jejejeje
weno total, lo que tengo es:

un fichero de socios (socis.dat) y una estructura, la estructura tiene un codigo numerico
y lo que quiero es, que cada vez que dé de alta un nuevo socio, se me ponga automaticamente el codigo siguiente.
todo esto con las librerias cstdlib y iostream, no gastamos mas

codigo:
if((fso=fopen("socis.dat", "wb+"))==NULL){
cout<<"ER1";
exit(0);
}

............................ aqui falta conseguir el ultimo codigo introducido

fseek (fso, 0L, SEEK_SET); //este fseek no se si esta bien



clrscr();
cout<<"DAR DE ALTA UN SOCIO"<<endl;
cout<<"Soci numero: "<<codi<<endl;
so.codi=codi;
cout<<"Nom: ";
cin>>so.nom;
cout<<"Telefon: ";
cin>>so.telefon;
cout<<"Carrer: ";
cin>>so.carrer;
cout<<"Poblacio: ";
cin>>so.poblacio;
cout<<"DNI: ";
cin>>so.dni;
cout<<"vols seguir?(s)(n)"<<endl;
cin>>opalso;



y si podeis decirme si el fseek ese para volver sl principio del fichero esta bien, ya seria estupendo

weno aqui os lo dejo, si no lo entendeis, preguntadme lo que sea

un saludo a todos, y gracias por adelantado

Última edición por acrata; 04/06/2008 a las 05:53
  #2 (permalink)  
Antiguo 04/06/2008, 05:43
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: alta ordenada en ficheros

la estructura es
struct socis{
int codi;
char nom[30];
char telefon[9];
char carrer[30];
char poblacio[15];
char dni[9];
};

y el campo en el que queria guardar el codigo se llama codi
por si os vale para algo
  #3 (permalink)  
Antiguo 04/06/2008, 12:45
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 18 años, 4 meses
Puntos: 3
Respuesta: alta ordenada en ficheros

Como mencionas, el fseek que tienes en tu código te coloca el puntero al principio del archivo.

Para la lectura de cada registro y cargarlo en la estructura anexo un pequeño ejemplo:
Código:
fseek(File,0L,SEEK_SET);
while(fread(Dato,sizeof(Dato),1,File)){

                stReg = (Reg *) malloc(sizeof(Reg));//Reserva memoria para la estructura
	vdInitStReg(stReg); //En esta función limpio la estructura
		
	fseek(File,sizeof(char),SEEK_CUR);
	fread(&stReg->Estatus,sizeof(stReg->Estatus),1,File);

	fseek(File,sizeof(stReg->Estatus)-1,SEEK_CUR);
	fread(stReg->Fecha ,sizeof(stReg->Fecha)-1,1,File);

	fseek(File,sizeof(char) ,SEEK_CUR);
	fread(stReg->Hora, sizeof(stReg->Hora)-1,1,File);

}
Donde Dato es un char[] con la longitud del registro +1 para al final dejar un '\0'. File es el puntador a mi archivo. stReg es un apuntador a una estructura de tipo Reg. La estructura Reg esta compuesta por los elementos

char Estatus
char Fecha[]
char Hora[]


Quiza me diran que porque no cargo directamente del archivo a la estructura. El problema que encontre es que al tener Strings (char[]) si se carga directo del archivo, no deja el ultimo elemento del array en '\0' y las variables se desbordan

Espero te sirva.
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #4 (permalink)  
Antiguo 05/06/2008, 05:48
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: alta ordenada en ficheros

muchas gracias por contestar Mephisto

no se que has querido hacer ai, pero lo veo muy complicado.
nosotros hemos dado lo de reservar memoria, pero no lo usamos, asi que......jejejeje
y ademas no me suena que reservaramos memoria para una estructura( no quiero decir que no se pueda hacer, jejeje).

para que haces tantos fseek??
solo qiero saber el codigo que deberia poner, con esto ira??
y si puede ser sin otra estructura ya seria la ostia, jajajaj

no has acertado en lo que queria(o eso creo), pero muchas gracias por contestar y sigue asi, jejeje

venga un saludo y gracias por ayudarme
  #5 (permalink)  
Antiguo 08/06/2008, 10:25
 
Fecha de Ingreso: junio-2008
Mensajes: 4
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: alta ordenada en ficheros

weno
antetodo, gracias a mephisto por contestar.......
al final logre sacarlo
aqui dejo un ejemplo de lo que queria hacer:

#include<iostream>
#include<cstdlib>
struct r_pdatos{
int codigo;
char curso[4];
char nombre[20];
int edad;
char telefono[10];};
void pedir_datos(struct r_pdatos *,int);
using namespace std;

int main (int argc, char *argv[]){
struct r_pdatos pda;
FILE *f;
int tamany,trobat=0;

cout<<"--> DAR DE ALTA CODIGO AUTOMATICO <--"<<endl<<endl;

if ((f=fopen("pdatos.dat","ab+"))==NULL)
{ cout<<"Error no se puede dar de alta. El fichero no se abre";
exit(1);
}
fseek(f,0,SEEK_END);//calcular tamaño
tamany=ftell(f);
if(tamany==0)
pedir_datos(&pda,1);

else{
fseek(f,tamany-sizeof(pda),SEEK_SET);
fread(&pda,sizeof(pda),1,f);
fseek(f,0,SEEK_END); //o fseek(f,0,SEEK_SET);
pedir_datos(&pda,pda.codigo+1);
}

fwrite(&pda,sizeof(pda),1,f);
fclose(f);
system ("PAUSE");
}

void pedir_datos (struct r_pdatos *a, int c)
{
a->codigo=c;
cout<<"Introduce nombre: ";
cin.getline(a->nombre,20);
cout<<"Introduce curso: ";
cin.getline(a->curso,4);
cout<<"Introduce edad: ";
cin>>a->edad;
cin.get();
cout<<"Introduce telefono: ";
cin.getline(a->telefono,10);
}


esto te pondria el codigo automaticamente, por si a alguien mas le sirve

hasta otra
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:40.