elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con eof, de fstream
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con eof, de fstream  (Leído 2,820 veces)
arcanu

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Problema con eof, de fstream
« en: 22 Noviembre 2010, 05:31 am »

Bueno tengo este codigo, y lo q pasa es q el final cuando estoy en el menu de mostrar datos, siempre me muesta el ultimo dato registrado dos veces, como si en la parte de agregar lo agregara dos veces.

este es el while ubicado casi al finalq  repite el numero de veces al mostar  y me muestra un valor mas. while (reg && !reg.eof()) tmb lo cambie por
 while ( !reg.eof()) y me da lo mismo, gracias.

Código:
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
struct datos
{
  char nombre[50];
  int telefono;
  char direccion[50];
  char email[50];
  int valido;       //valido=1->si existe        valido=0->no existe
  int valido2;  //checara si el registro es correcto... siempre sera igual a 1706887114
};
int menu()
{
  int n=0;
  system("cls");
  cout<<endl<<endl;
  cout<<"                 ==========================================="<<endl;
  cout<<"                 ||            AGENDA PERSONAL            ||"<<endl;
  cout<<"                 ==========================================="<<endl;
  cout<<"                 ||      1. AGREGAR NUEVO REGISTRO        ||"<<endl;
  cout<<"                 ||      2. BUSCAR REGISTRO               ||"<<endl;
  cout<<"                 ||      3. MOSTRAR TODOS LOS REGISTROS   ||"<<endl;
  cout<<"                 ||      4. SALIR                         ||"<<endl;
  cout<<"                 ==========================================="<<endl<<endl;
  while ((n<1) || (n>4))
    { cout<<"          Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>n; }
  cout<<endl;
  return n;
}
void agregar(struct datos d)
{
  char na='s';        //na=preguntar si kiere nuevo registro
  while (na=='s')
    {
    char nn='x';  //nn=verificacion para agregar el registro
    system ("cls"); //borramos pantalla
    //guardamos los datos temporalmente en el struct
    cout<<"Nombre: "; cin>> d.nombre;
    cout<<"Telefono: "; cin>> d.telefono;
    cout<<"Direccion: "; cin>> d.direccion;
    cout<<"Email: "; cin>> d.email; cout<<endl;
    d.valido=1;   //decimos que el registro si existe
    d.valido2=1706887114; //con esto garantizamos que es uno de nuestros registros
    //verificamos si kiere agregar el nuevo registro
    while ((nn!='s') && (nn!='n'))
      { cout<<endl<<"Deseas agregar el nuevo registro? [s-n]: "; cin>>nn; }
    //agregamos
    if (nn=='s')
      {
       ofstream reg("registros.dat", ios::app | ios::binary); //activamos el archivo en modo de escritura  tomando en cuenta el parametro "app" para agregar en la ultima posicion del archivo
       if(!reg)                         //si no se pudo abrir el archivo
         { cout <<"No se puede abrir el fichero."; }
       reg.seekp(0, ios::end); // Colocar el cursor al final del archivo
       reg.write((char *) &d, sizeof(d));  //escribimos el nuevo registro
       reg.close();  //cerramos el archivo
       cout<<endl<<"Registro agregado exitosamente"<<endl;
       system("pause");
      }
    else
      {
       //borramos los datos temporales del struct
       strcpy(d.nombre,"");
       d.telefono=0;
       strcpy(d.direccion,"");
       strcpy(d.email,"");
       d.valido=0;
       d.valido2=0;
       cout<<endl<<"El Registro NO fue agregado"<<endl;
       system("pause");
      }
    na='x';
    while ((na!='s') && (na!='n'))
      { cout<<endl<<endl<<"Deseas agregar un registro nuevo? [s-n]: "; cin>>na; } //la validacion se hace en el while inicial
  }//endwhile
}
void modificar(struct datos d, int nm)
{
   char nnm='x';
   system ("cls"); //borramos pantalla
   //guardamos los datos temporalmente en el struct
   cout<<"Nombre: "; cin>> d.nombre;
   cout<<"Telefono: "; cin>> d.telefono;
   cout<<"Direccion: "; cin>> d.direccion;
   cout<<"Email: "; cin>> d.email; cout<<endl;
   d.valido=1; //decimos que si existe
   d.valido2=1706887114;
   //verificamos si kiere modificar el registro
   while ((nnm!='s') && (nnm!='n'))
     { cout<<endl<<"Deseas modificar este registro? [s-n]: "; cin>>nnm; }
   //agregamos
   if (nnm=='s')
     {
      ofstream reg("registros.dat", ios::out | ios::binary); //activamos el archivo en modo de escritura  (creamos el objeto 'reg')
      if(!reg)                         //si no se pudo abrir el archivo
        { cout <<"No se puede abrir el fichero."; }
      reg.seekp((nm-1)*sizeof(d));     //colocamos el apuntador en la posicion inicial del registro a modificar
      reg.write((char *) &d, sizeof(d));  //escribimos el nuevo registro
      reg.close();  //cerramos el archivo
      cout<<endl<<"Registro modificado exitosamente"<<endl;
     }
   else
     {
      //borramos los datos temporales del struct
      strcpy(d.nombre,"");
      d.telefono=0;
      strcpy(d.direccion,"");
      strcpy(d.email,"");
      d.valido=1;
      d.valido2=0;
      cout<<endl<<"El Registro NO fue modificado"<<endl;
     }
   system("pause");
}
void eliminar(struct datos d, int ne)
{
   system ("cls"); //borramos pantalla
   d.valido=0;   //modificamos "valid0" del struct para decir que ese registro no sera tomado en cuenta
   d.valido2=1706887114; //agregamos nuestra garantia de registro
   //ahora actualizamos el registro
   ofstream reg("registros.dat", ios::out | ios::binary); //activamos el archivo en modo de escritura  (creamos el objeto 'reg')
   if(!reg)                         //si no se pudo abrir el archivo
      { cout <<"No se puede abrir el fichero."<<endl; system("pause");}
   reg.seekp((ne-1)*sizeof(d));     //colocamos el apuntador en la posicion inicial del registro a modificar
   reg.write((char *) &d, sizeof(d));  //escribimos el nuevo registro
   reg.close();  //cerramos el archivo
   cout<<endl<<"Registro eliminado"<<endl;
   system("pause");
}
void buscar(struct datos d)
{
  int nb1=0, nb=-2;  //nb1=variable auxiliar para saber si kiere volver a buskar o salir  nb=variable que guarda el #de registro buskado
  while (nb1<4)
    {
    if (nb1==2)
      { modificar(d, nb); }
    else
      {
       if (nb1==3)
         { eliminar(d, nb); }
      }
    system("cls"); //borramos pantalla
    int nb=-2;
    while (nb<0)
      { cout<<"Introduce el registro a buscar [0 para salir]: "; cin>>nb; }
    if (nb!=0) //si kiere buskar...
      {
      ifstream reg("registros.dat", ios::in | ios::binary);      //activa el archivo en modo de lectura (creamos el objeto 'reg')
      reg.seekg((nb-1)*sizeof(d));     //colocamos el apuntador en la posicion inicial del registro encontrado
      reg.read((char *) &d, sizeof d);        //leemos el registro encontrado
      //verificamos que el registro es correcto
      if ((d.valido==1) && (d.valido2==1706887114))
        {
        cout<<endl<<endl<<"--------Registro encontrado--------"<<endl;
        cout<<"Nombre: "<<d.nombre<<endl<<"Telefono: "<<d.telefono<<endl<<"Direccion: "<<d.direccion<<endl<<"Email: "<<d.email<<endl<<endl;
        cout<<endl;    //imprimimos menu de opciones
        cout<<"                 ================================"<<endl;
        cout<<"                 ||          OPCIONES          ||"<<endl;
        cout<<"                 ================================"<<endl;
        cout<<"                 ||    1. NUEVA BUSQUEDA       ||"<<endl;
        cout<<"                 ||    2. MODIFICAR REGISTRO   ||"<<endl;
        cout<<"                 ||    3. ELIMINAR REGISTRO    ||"<<endl;
        cout<<"                 ||    4. SALIR                ||"<<endl;
        cout<<"                 ================================"<<endl<<endl;
        nb1=0;
        while ((nb1<1) || (nb1>4))
          { cout<<"     Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>nb1; }
        cout<<endl;
        }//endif ((d.valido==1) && (d.valido2==1706887114))
      else //si el registro encontrado no es correcto
        {
         cout<<endl<<"El registro buscado no existe"<<endl;
         system("pause");
         nb1=1;
        }
      }//endif (nb!=0)
    else     //si ya se kiere salir
      { nb1=4; } //igualamos la bandera a 4 para que se salga
    } //endwhile
}
void mostrar(struct datos d)
{
  int nb11=0,con=0,nme=0,bandera=0;  //nb1=variable auxiliar para saber si kiere volver a buskar o salir  nb=variable que guarda el #de registro buskado
  while (nb11<3)
    {
    if (nb11==1)
      { modificar(d, nme); }
    else
      {
       if (nb11==2)
         { eliminar(d, nme); }
      }
    system("cls"); //borramos pantalla
    ifstream reg("registros.dat", ios::in | ios::binary);      //activa el archivo en modo de lectura (creamos el objeto 'reg')
    con=0;
    bandera=0;
    while (reg && !reg.eof()) //aca el problema
      {
       reg.seekg((con)*sizeof(d));     //colocamos el apuntador en la posicion inicial del registro encontrado
       reg.read((char *) &d, sizeof d);        //leemos el registro encontrado
       con++; //incrementamos contador del registro
       //verificamos que el registro es correcto
       if ((d.valido==1) && (d.valido2==1706887114))
         {
         bandera=1;
         cout<<endl<<"--------Registro "<<con<<"--------"<<endl;
         cout<<"Nombre: "<<d.nombre<<endl<<"Telefono: "<<d.telefono<<endl<<"Direccion: "<<d.direccion<<endl<<"Email: "<<d.email<<endl<<endl;
         }//endif
      }//endwhile
    if (bandera==1)
     {
      cout<<endl<<endl;    //imprimimos menu de opciones
      cout<<"                 ================================"<<endl;
      cout<<"                 ||          OPCIONES          ||"<<endl;
      cout<<"                 ================================"<<endl;
      cout<<"                 ||    1. MODIFICAR REGISTRO   ||"<<endl;
      cout<<"                 ||    2. ELIMINAR REGISTRO    ||"<<endl;
      cout<<"                 ||    3. SALIR                ||"<<endl;
      cout<<"                 ================================"<<endl<<endl;
      nb11=0;
      //preguntamos por que opcion kiere realizar
      while ((nb11<1) || (nb11>3))
        { cout<<"     Introduce un numero de las opciones listadas arriba [1-4]: "; cin>>nb11; }
      nme=0;
      while ((nme<1) && (nb11<3))
        { cout<<"     Introduce el numero del registro: "; cin>>nme; }
     }//endif bandera=1
    else
      { cout<<"No existen registros!"<<endl; system("pause"); nb11=3;}
    } //endwhile
}
int main()
{
  struct datos d;
  int x=0;
  fstream ("registros.dat", ios::out | ios::in | ios::binary);   //creamos el archivo
  int n=0,band=0;
  while (band==0)
    {
     n=menu();
     switch (n)
       {
        case 1: agregar(d); break;
        case 2: buscar(d); break;
        case 3: mostrar(d); break;
        case 4: band=1; break;
       }
    }
  system("PAUSE");
  return 0;
}


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Practicando con fstream
Programación C/C++
anonimo12121 3 3,027 Último mensaje 3 Abril 2011, 17:17 pm
por anonimo12121
fstream.h
Programación C/C++
laephy 1 6,371 Último mensaje 13 Abril 2011, 23:40 pm
por ssaammuu
Programa usando libreria fstream
Programación C/C++
@ron 0 5,059 Último mensaje 14 Abril 2011, 03:01 am
por @ron
Problema con fstream en c++
Programación C/C++
anamnesis_92 5 4,133 Último mensaje 14 Febrero 2012, 11:58 am
por anamnesis_92
Explicacion acerca de fstream
Programación C/C++
bash 1 2,293 Último mensaje 24 Mayo 2013, 14:30 pm
por bash
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines