ayuda con registros y archivos .txt en C++

Iniciado por chiripita, 1 Agosto 2014, 17:54 PM

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

chiripita

Por favor si pueden ayudarme con esto. Debo crear un registro que pueda insertar, modificar, eliminar y mostrar listado. En la parte Eliminar tengo un arroz con mango, en la linea 120 me da error y ya no se que hacer.

Aquí les copio todo el código,
Gracias de antemano.

Código (c++) [Seleccionar]
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string.h>
#include <stdio.h>

using namespace std;

struct t_padres
{
int cedula;
char nombre[20];
};

struct t_datos
{
int cedula, telefono;
char nombre[20], correo[30];
t_padres padres[2];

} persona[5];
int dat_clave;
int eliminar;
char opc1;
short opc = 0, opcI=0, i=0, j=0;
void INSERTAR()
{ do{
cout<<"REGISTRAR"<<endl;
cout<<endl;
cout<<"Indique la cedula de la persona: "<<endl;
cin>>persona[i].cedula;
cout<<"Indique el nombre de la persona: "<<endl;
cin>>persona[i].nombre;
cout<<"Indique el correo de la persona: "<<endl;
cin>>persona[i].correo;
cout<<"Indique el telefono de la persona: "<<endl;
cin>>persona[i].telefono;
cout<<"Indique la cedula del padre: "<<endl;
cin>>persona[i].padres[0].cedula;
cout<<"Indique el nombre del padre: "<<endl;
cin>>persona[i].padres[0].nombre;
cout<<"Indique la cedula del madre: "<<endl;
cin>>persona[i].padres[1].cedula;
cout<<"Indique el nombre del madre: "<<endl;
cin>>persona[i].padres[1].nombre;
i++;

}
while(opcI = 1 && i < 5);
}

void MODIFICAR()
{ do{
cout<<"Indique la cedula: "<<endl;
cin>>dat_clave;
if(dat_clave == persona[j].cedula)

cout<<"Indique el nombre de la persona: "<<endl;
cin>>persona[j].nombre;
cout<<"Indique el correo de la persona: "<<endl;
cin>>persona[j].correo;
cout<<"Indique el telefono de la persona: "<<endl;
cin>>persona[j].telefono;
cout<<"Indique la cedula del padre: "<<endl;
cin>>persona[j].padres[0].cedula;
cout<<"Indique el nombre del padre: "<<endl;
cin>>persona[j].padres[0].nombre;
cout<<"Indique la cedula del madre: "<<endl;
cin>>persona[j].padres[1].cedula;
cout<<"Indique el nombre del madre: "<<endl;
cin>>persona[j].padres[1].nombre;
j++;
}
while (j < 5);
}

void ELIMINAR()
{ cout<<"USUARIOS REGISTRADOS: "<<endl;

cout<<"Usuario 1:"<<persona[1].cedula<<" , "<<persona[1].nombre<<" , "<<persona[1].correo<< " , "<<persona[1].telefono<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , " <<endl;
cout<<endl;

cout<<"Usuario 2:"<<persona[2].cedula<<" , "<<persona[2].nombre<<" , "<<persona[2].correo<< " , "<<persona[2].telefono<<" , "<<persona[2].padres[2].cedula<<" , "<<persona[2].padres[2].nombre<<" , "<<persona[2].padres[2].cedula<<" , "<<persona[2].padres[2].nombre<<" , "<<endl;
cout<<endl;

cout<<"Usuario 3:"<<persona[3].cedula<<" , "<<persona[3].nombre<<" , "<<persona[3].correo<< " , "<<persona[3].telefono<<" , "<<persona[3].padres[3].cedula<<" , "<<persona[3].padres[3].nombre<<" , "<<persona[3].padres[3].cedula<<" , "<<persona[3].padres[3].nombre<<" , "<<endl;
cout<<endl;

cout<<"Usuario 4:"<<persona[4].cedula<<" , "<<persona[4].nombre<<" , "<<persona[4].correo<< " , "<<persona[4].telefono<<" , "<<persona[4].padres[4].cedula<<" , "<<persona[4].padres[4].nombre<<" , "<<persona[4].padres[4].cedula<<" , "<<persona[4].padres[4].nombre<<" , "<<endl;
cout<<endl;

cout<<"Usuario 5:"<<persona[5].cedula<<" , "<<persona[5].nombre<<" , "<<persona[5].correo<< " , "<<persona[5].telefono<<" , "<<persona[5].padres[5].cedula<<" , "<<persona[5].padres[5].nombre<<" , "<<persona[5].padres[5].cedula<<" , "<<persona[5].padres[5].nombre<<" , "<<endl;
cout<<endl;

cout<<"Seleccione numero de usuario para eliminar: "<<endl;
cin>>eliminar;

cout<<"Eliminando Usuario Seleccionado........"<<endl;

ifstream salida;
salida.open("registros.txt",ios::in);

ofstream entrada;

if(salida.fail()){
cout<<"Hubo un error al abrir el archivo registros.txt"<<endl;
getch();
}
else{
char aux[20];

cout<<"Ingrese la cedula: "<<endl;
cin>>aux;

salida>>persona[i].cedula;

while(!salida.eof()){

salida>>t_datos.nombre>>t_datos.correo>>t_datos.telefono>>t_padres.cedula>>t_padres.nombre>>t_padres.cedula>>t_padres.nombre<<endl;

if(strcmp()){

cout<<" El registro se ha eliminado"<<endl;
getch();
}
else{

entrada<<t_datos.nombre<<t_datos.correo<<t_datos.telefono<<t_padres.cedula<<t_padres.nombre<<t_padres.cedula<<t_padres.nombre<<endl;
}
salida>>cedula;

}
entrada.close();
salida.close();

remove("registros.txt");
rename("temp.txt","registros.txt");

}

cout<<"Usuario 1:"<<persona[1].cedula<<" , "<<persona[1].nombre<<" , "<<persona[1].correo<< " , "<<persona[1].telefono<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , " <<endl;
cout<<endl;
cout<<"Usuario 2:"<<persona[2].cedula<<" , "<<persona[2].nombre<<" , "<<persona[2].correo<< " , "<<persona[2].telefono<<" , "<<persona[2].padres[2].cedula<<" , "<<persona[2].padres[2].nombre<<" , "<<persona[2].padres[2].cedula<<" , "<<persona[2].padres[2].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 3:"<<persona[3].cedula<<" , "<<persona[3].nombre<<" , "<<persona[3].correo<< " , "<<persona[3].telefono<<" , "<<persona[3].padres[3].cedula<<" , "<<persona[3].padres[3].nombre<<" , "<<persona[3].padres[3].cedula<<" , "<<persona[3].padres[3].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 4:"<<persona[4].cedula<<" , "<<persona[4].nombre<<" , "<<persona[4].correo<< " , "<<persona[4].telefono<<" , "<<persona[4].padres[4].cedula<<" , "<<persona[4].padres[4].nombre<<" , "<<persona[4].padres[4].cedula<<" , "<<persona[4].padres[4].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 5:"<<persona[5].cedula<<" , "<<persona[5].nombre<<" , "<<persona[5].correo<< " , "<<persona[5].telefono<<" , "<<persona[5].padres[5].cedula<<" , "<<persona[5].padres[5].nombre<<" , "<<persona[5].padres[5].cedula<<" , "<<persona[5].padres[5].nombre<<" , "<<endl;
cout<<endl;
}

void LISTADO()
{ cout<<"Usuario 1:"<<persona[1].cedula<<" , "<<persona[1].nombre<<" , "<<persona[1].correo<< " , "<<persona[1].telefono<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , " <<endl;
cout<<endl;
cout<<"Usuario 2:"<<persona[2].cedula<<" , "<<persona[2].nombre<<" , "<<persona[2].correo<< " , "<<persona[2].telefono<<" , "<<persona[2].padres[2].cedula<<" , "<<persona[2].padres[2].nombre<<" , "<<persona[2].padres[2].cedula<<" , "<<persona[2].padres[2].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 3:"<<persona[3].cedula<<" , "<<persona[3].nombre<<" , "<<persona[3].correo<< " , "<<persona[3].telefono<<" , "<<persona[3].padres[3].cedula<<" , "<<persona[3].padres[3].nombre<<" , "<<persona[3].padres[3].cedula<<" , "<<persona[3].padres[3].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 4:"<<persona[4].cedula<<" , "<<persona[4].nombre<<" , "<<persona[4].correo<< " , "<<persona[4].telefono<<" , "<<persona[4].padres[4].cedula<<" , "<<persona[4].padres[4].nombre<<" , "<<persona[4].padres[4].cedula<<" , "<<persona[4].padres[4].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 5:"<<persona[5].cedula<<" , "<<persona[5].nombre<<" , "<<persona[5].correo<< " , "<<persona[5].telefono<<" , "<<persona[5].padres[5].cedula<<" , "<<persona[5].padres[5].nombre<<" , "<<persona[5].padres[5].cedula<<" , "<<persona[5].padres[5].nombre<<" , "<<endl;
cout<<endl;
}


int main(int argc, char *argv[])
{

do{
cout<<"OPCIONES"<<endl;
cout<<endl;
cout<<"1.- INSERTAR"<<endl;
cout<<"2.- MODIFICAR"<<endl;
cout<<"3.- ELIMINAR"<<endl;
cout<<"4.- LISTADO"<<endl;
cout<<"5.- SALIR"<<endl;
cout<<endl;
cout<<"Indique su opcion"<<endl;
cin>>opc;

switch (opc) {
case 1:{ INSERTAR();
break;
}

case 2:{ MODIFICAR();
break;
}


case 3:{ ELIMINAR();
break;
}

case 4:{ LISTADO();
break;
}
default:{
cout<<"Opcion invalida...."<<endl ;
} break;
}

} while (opc != 5);
cout<<"Desea Realizar otra operacion ¿s/n?"<<endl;
cin>>opc1;

} while (opc1 == 's');

}
system("PAUSE");
return EXIT_SUCCESS;
}

Eternal Idol

En la linea 120 no podes usar t_datos como si fuera una variable, es una estructura. strcmp necesita parametros y retorna 0 cuando las cadenas comparadas son iguales ... ahora continua vos mismo ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

chiripita

Entonces se supone que iria así?
                           salida>>persona.nombre>>persona.correo>>persona.telefono>>persona.cedula>>persona.nombre>>persona.cedula>>persona.nombre<<endl;
                             
Como se puede dar cuenta esta parte no la entiendo bien.   

eferion

Si usas C++, mi consejo es que, salvo que sea una "obligación" o estés aprendiendo y quieras pasar por ello, tengas en cuenta lo siguiente:

No uses char* para la gestión de cadenas de texto. En su lugar usa la clase "string".

Porque es más bonito, más legible y da menos problemas esto:

Código (cpp) [Seleccionar]

std::string cadena = "algo";
std::string otra_cadena = cadena;

cadena += "otra cosa";


que esto otro:

Código (cpp) [Seleccionar]

char cadena[ 40 ];
char otra_cadena[ 40 ];

strcpy( cadena, "algo" );
strcpy( otra_cadena, cadena );

strcat( cadena, "otra cosa" );


No uses variables globales, son más problemáticas de lo que te imaginas.

El problema de las variables globales es que no queda clara la forma en que se usan... además es fácil que puedan quedar "tapadas" por variables locales, lo que dificulta muchísimo la lectura del código y la búsqueda de errores. En serio, es mejor evitar las variables globales.

Puede que haya alguna rara excepción en la que sea mejor usarlas... pero no creo que te veas en esas mientras aprendes. Además siempre es mejor tener una clase estática o un singleton que tener variables globales.

Intenta marcarte una longitud máxima para cada línea de código.

Tener líneas de código con, por ejemplo 3000 caracteres no ayuda a que el código sea legible. Lo ideal es que el código entre en la pantalla sin necesidad de hacer scroll horizontal.

Antes, cuando los editores iban sobre shell, el límite aceptado eran 80 caracteres... hoy en día gracias a dios no hace falta ser tan estricto... pero aún así en serio, intenta evitar scroll horizontal en tu código:

Código (cpp) [Seleccionar]

// Linea dificil de leer
cout<<"Usuario 1:"<<persona[1].cedula<<" , "<<persona[1].nombre<<" , "<<persona[1].correo<< " , "<<persona[1].telefono<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , " <<endl;

// Linea mas legible
cout << "Usuario 1:" << persona[1].cedula << " , "
                     << persona[1].nombre << " , "
                     << persona[1].correo << " , "
                     << persona[1].telefono << " , "
                     << persona[1].padres[1].cedula << " , "
                     << persona[1].padres[1].nombre << " , "
                     << persona[1].padres[1].cedula << " , "
                     << persona[1].padres[1].nombre << " , " << endl;


Creo que la diferencia es evidente.

En C++ no uses includes de C

Los includes de la librería de C tienen TODOS el sufijo ".h", los includes de C++ carecen de dicho sufijo. Si en algún momento tienes que usar una función propia de C en C++, has de saber que estas funciones tienen un include tipo C++. Por ejemplo:


  • El include de math.h, en C++ es cmath
  • El include de stdio.h, en C++ es cstdio

Piensa que, aunque son compatibles, son lenguajes diferentes y no queda claro que vayan a ser compatibles eternamente... mejor diferenciar claramente cada lenguaje.

Tabula el codigo

Si todo el código es "plano", es decir, está todo al mismo nivel, resulta complicado saber qué código está dentro de un determinado bucle:

Código (cpp) [Seleccionar]

void func( )
{
int i=1, j=5;
while(i++)
{
if (i==j)
{
std::cout << i << std::endl;
j += 5;
}
if (i%30==0)
{
if (i==j)
{
std::cout << i << j << std::endl;
}
} // <<<
}
}


¿Está bien escrito el código de arriba?
¿A qué bucle o condición pertenece la llave que tiene el comentario?

Desde luego es complicado responder a estas preguntas sin estar un ratito mirando el código... sin embargo si tabulamos el código la cosa cambia:

Código (cpp) [Seleccionar]

void func( )
{
  int i=1, j=5;
  while(i++)
  {
    if (i==j)
    {
      std::cout << i << std::endl;
      j += 5;
    }

    if (i%30==0)
    {
      if (i==j)
      {
        std::cout << i << j << std::endl;
      }
    } // <<<
  }
}


Ahora se entiende mejor, ¿no? pues eso mismo.

Intenta "abusar" de los bucles.

Un concepto básico de la programación es intentar reutilizar el código lo máximo posible (dentro, claro está, de unos límites aceptables).

En tu caso, estás sacando por pantalla 5 registros diferentes copiando, literalmente, el código 5 veces... si tienes un problema en ese código, o si necesitas hacer algún cambio, tendrás que aplicar el cambio 5 veces... lo cual es poco eficiente y bastante propenso a errores.

Para este tipo de tareas repetitivas se inventaron los bucles. Saca tus propias conclusiones:

Sin bucles:

Código (cpp) [Seleccionar]

cout<<"Usuario 1:"<<persona[1].cedula<<" , "<<persona[1].nombre<<" , "<<persona[1].correo<< " , "<<persona[1].telefono<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , "<<persona[1].padres[1].cedula<<" , "<<persona[1].padres[1].nombre<<" , " <<endl;
cout<<endl;
cout<<"Usuario 2:"<<persona[2].cedula<<" , "<<persona[2].nombre<<" , "<<persona[2].correo<< " , "<<persona[2].telefono<<" , "<<persona[2].padres[2].cedula<<" , "<<persona[2].padres[2].nombre<<" , "<<persona[2].padres[2].cedula<<" , "<<persona[2].padres[2].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 3:"<<persona[3].cedula<<" , "<<persona[3].nombre<<" , "<<persona[3].correo<< " , "<<persona[3].telefono<<" , "<<persona[3].padres[3].cedula<<" , "<<persona[3].padres[3].nombre<<" , "<<persona[3].padres[3].cedula<<" , "<<persona[3].padres[3].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 4:"<<persona[4].cedula<<" , "<<persona[4].nombre<<" , "<<persona[4].correo<< " , "<<persona[4].telefono<<" , "<<persona[4].padres[4].cedula<<" , "<<persona[4].padres[4].nombre<<" , "<<persona[4].padres[4].cedula<<" , "<<persona[4].padres[4].nombre<<" , "<<endl;
cout<<endl;
cout<<"Usuario 5:"<<persona[5].cedula<<" , "<<persona[5].nombre<<" , "<<persona[5].correo<< " , "<<persona[5].telefono<<" , "<<persona[5].padres[5].cedula<<" , "<<persona[5].padres[5].nombre<<" , "<<persona[5].padres[5].cedula<<" , "<<persona[5].padres[5].nombre<<" , "<<endl;
cout<<endl;


Con bucles ( y aplicando lo comentado anteriormente tambien ):

Código (cpp) [Seleccionar]

for ( int i = 0; i < 5; i++ )
{
  cout << "Usuario " << i << ": " << persona[ i ].cedula
                                  << " , " << persona[ i ].nombre
                                  << " , " << persona[ i ].correo
                                  << " , " << persona[ i ].telefono
                                  << " , " << persona[ i ].padres[ i ].cedula
                                  << " , " << persona[ i ].padres[ i ].nombre
                                  << " , " << persona[ i ].padres[ i ].cedula // duplicado
                                  << " , " << persona[ i ].padres[ i ].nombre // duplicado
                                  << endl;
}


Por cierto, fíjate que ahora se aprecian varios errores:

* para cada "persona" solo imprimes un "padre"... eso huele mal.
* Para el "padre" estás sacando dos veces la misma información... líneas con comentario

Seguro que si intentas ver estos errores en tu código te va a costar más encontrarlos (sobretodo si no sabes que están ahí)

Y bueno, de momento creo que te he comentado bastantes cosillas, deberías repasar un poco tu código. Si después de eso sigues teniendo dudas aquí estamos.

Un saludo.