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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ayuda con registros y archivos .txt en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ayuda con registros y archivos .txt en C++  (Leído 3,591 veces)
chiripita

Desconectado Desconectado

Mensajes: 2


Ver Perfil
ayuda con registros y archivos .txt en C++
« en: 1 Agosto 2014, 17:54 pm »

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
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <conio.h>
  5. #include <string.h>
  6. #include <stdio.h>
  7.  
  8. using namespace std;
  9.  
  10. struct t_padres
  11. {
  12. int cedula;
  13. char nombre[20];
  14. };
  15.  
  16. struct t_datos
  17. {
  18. int cedula, telefono;
  19. char nombre[20], correo[30];
  20. t_padres padres[2];
  21.  
  22. } persona[5];
  23. int dat_clave;
  24. int eliminar;
  25. char opc1;
  26. short opc = 0, opcI=0, i=0, j=0;
  27. void INSERTAR()
  28. { do{
  29. cout<<"REGISTRAR"<<endl;
  30. cout<<endl;
  31. cout<<"Indique la cedula de la persona: "<<endl;
  32. cin>>persona[i].cedula;
  33. cout<<"Indique el nombre de la persona: "<<endl;
  34. cin>>persona[i].nombre;
  35. cout<<"Indique el correo de la persona: "<<endl;
  36. cin>>persona[i].correo;
  37. cout<<"Indique el telefono de la persona: "<<endl;
  38. cin>>persona[i].telefono;
  39. cout<<"Indique la cedula del padre: "<<endl;
  40. cin>>persona[i].padres[0].cedula;
  41. cout<<"Indique el nombre del padre: "<<endl;
  42. cin>>persona[i].padres[0].nombre;
  43. cout<<"Indique la cedula del madre: "<<endl;
  44. cin>>persona[i].padres[1].cedula;
  45. cout<<"Indique el nombre del madre: "<<endl;
  46. cin>>persona[i].padres[1].nombre;
  47. i++;
  48.  
  49. }
  50. while(opcI = 1 && i < 5);
  51. }
  52.  
  53. void MODIFICAR()
  54. { do{
  55. cout<<"Indique la cedula: "<<endl;
  56. cin>>dat_clave;
  57. if(dat_clave == persona[j].cedula)
  58.  
  59. cout<<"Indique el nombre de la persona: "<<endl;
  60. cin>>persona[j].nombre;
  61. cout<<"Indique el correo de la persona: "<<endl;
  62. cin>>persona[j].correo;
  63. cout<<"Indique el telefono de la persona: "<<endl;
  64. cin>>persona[j].telefono;
  65. cout<<"Indique la cedula del padre: "<<endl;
  66. cin>>persona[j].padres[0].cedula;
  67. cout<<"Indique el nombre del padre: "<<endl;
  68. cin>>persona[j].padres[0].nombre;
  69. cout<<"Indique la cedula del madre: "<<endl;
  70. cin>>persona[j].padres[1].cedula;
  71. cout<<"Indique el nombre del madre: "<<endl;
  72. cin>>persona[j].padres[1].nombre;
  73. j++;
  74. }
  75. while (j < 5);
  76. }
  77.  
  78. void ELIMINAR()
  79. { cout<<"USUARIOS REGISTRADOS: "<<endl;
  80.  
  81. 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;
  82. cout<<endl;
  83.  
  84. 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;
  85. cout<<endl;
  86.  
  87. 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;
  88. cout<<endl;
  89.  
  90. 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;
  91. cout<<endl;
  92.  
  93. 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;
  94. cout<<endl;
  95.  
  96. cout<<"Seleccione numero de usuario para eliminar: "<<endl;
  97. cin>>eliminar;
  98.  
  99. cout<<"Eliminando Usuario Seleccionado........"<<endl;
  100.  
  101. ifstream salida;
  102. salida.open("registros.txt",ios::in);
  103.  
  104. ofstream entrada;
  105.  
  106. if(salida.fail()){
  107. cout<<"Hubo un error al abrir el archivo registros.txt"<<endl;
  108. }
  109. else{
  110. char aux[20];
  111.  
  112. cout<<"Ingrese la cedula: "<<endl;
  113. cin>>aux;
  114.  
  115. salida>>persona[i].cedula;
  116.  
  117. while(!salida.eof()){
  118.  
  119. salida>>t_datos.nombre>>t_datos.correo>>t_datos.telefono>>t_padres.cedula>>t_padres.nombre>>t_padres.cedula>>t_padres.nombre<<endl;
  120.  
  121. if(strcmp()){
  122.  
  123. cout<<" El registro se ha eliminado"<<endl;
  124. }
  125. else{
  126.  
  127. entrada<<t_datos.nombre<<t_datos.correo<<t_datos.telefono<<t_padres.cedula<<t_padres.nombre<<t_padres.cedula<<t_padres.nombre<<endl;
  128. }
  129. salida>>cedula;
  130.  
  131. }
  132. entrada.close();
  133. salida.close();
  134.  
  135. remove("registros.txt");
  136. rename("temp.txt","registros.txt");
  137.  
  138. }
  139.  
  140. 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;
  141. cout<<endl;
  142. 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;
  143. cout<<endl;
  144. 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;
  145. cout<<endl;
  146. 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;
  147. cout<<endl;
  148. 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;
  149. cout<<endl;
  150. }
  151.  
  152. void LISTADO()
  153. { 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;
  154. cout<<endl;
  155. 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;
  156. cout<<endl;
  157. 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;
  158. cout<<endl;
  159. 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;
  160. cout<<endl;
  161. 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;
  162. cout<<endl;
  163. }
  164.  
  165.  
  166. int main(int argc, char *argv[])
  167. {
  168.  
  169. do{
  170. cout<<"OPCIONES"<<endl;
  171. cout<<endl;
  172. cout<<"1.- INSERTAR"<<endl;
  173. cout<<"2.- MODIFICAR"<<endl;
  174. cout<<"3.- ELIMINAR"<<endl;
  175. cout<<"4.- LISTADO"<<endl;
  176. cout<<"5.- SALIR"<<endl;
  177. cout<<endl;
  178. cout<<"Indique su opcion"<<endl;
  179. cin>>opc;
  180.  
  181. switch (opc) {
  182. case 1:{ INSERTAR();
  183. break;
  184. }
  185.  
  186. case 2:{ MODIFICAR();
  187. break;
  188. }
  189.  
  190.  
  191. case 3:{ ELIMINAR();
  192. break;
  193. }
  194.  
  195. case 4:{ LISTADO();
  196. break;
  197. }
  198. default:{
  199. cout<<"Opcion invalida...."<<endl ;
  200. } break;
  201. }
  202.  
  203. } while (opc != 5);
  204. cout<<"Desea Realizar otra operacion ¿s/n?"<<endl;
  205. cin>>opc1;
  206.  
  207. } while (opc1 == 's');
  208.  
  209. }
  210. system("PAUSE");
  211. return EXIT_SUCCESS;
  212. }


« Última modificación: 1 Agosto 2014, 18:21 pm por Eternal Idol » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: ayuda con registros y archivos .txt en C++
« Respuesta #1 en: 1 Agosto 2014, 18:27 pm »

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 ...


En línea

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

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: ayuda con registros y archivos .txt en C++
« Respuesta #2 en: 1 Agosto 2014, 18:35 pm »

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.   
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: ayuda con registros y archivos .txt en C++
« Respuesta #3 en: 4 Agosto 2014, 10:25 am »

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
  1. std::string cadena = "algo";
  2. std::string otra_cadena = cadena;
  3.  
  4. cadena += "otra cosa";

que esto otro:

Código
  1. char cadena[ 40 ];
  2. char otra_cadena[ 40 ];
  3.  
  4. strcpy( cadena, "algo" );
  5. strcpy( otra_cadena, cadena );
  6.  
  7. 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
  1. // Linea dificil de leer
  2. 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;
  3.  
  4. // Linea mas legible
  5. cout << "Usuario 1:" << persona[1].cedula << " , "
  6.                     << persona[1].nombre << " , "
  7.                     << persona[1].correo << " , "
  8.                     << persona[1].telefono << " , "
  9.                     << persona[1].padres[1].cedula << " , "
  10.                     << persona[1].padres[1].nombre << " , "
  11.                     << persona[1].padres[1].cedula << " , "
  12.                     << 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
  1. void func( )
  2. {
  3. int i=1, j=5;
  4. while(i++)
  5. {
  6. if (i==j)
  7. {
  8. std::cout << i << std::endl;
  9. j += 5;
  10. }
  11. if (i%30==0)
  12. {
  13. if (i==j)
  14. {
  15. std::cout << i << j << std::endl;
  16. }
  17. } // <<<
  18. }
  19. }

¿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
  1. void func( )
  2. {
  3.  int i=1, j=5;
  4.  while(i++)
  5.  {
  6.    if (i==j)
  7.    {
  8.      std::cout << i << std::endl;
  9.      j += 5;
  10.    }
  11.  
  12.    if (i%30==0)
  13.    {
  14.      if (i==j)
  15.      {
  16.        std::cout << i << j << std::endl;
  17.      }
  18.    } // <<<
  19.  }
  20. }

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
  1. 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;
  2. cout<<endl;
  3. 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;
  4. cout<<endl;
  5. 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;
  6. cout<<endl;
  7. 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;
  8. cout<<endl;
  9. 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;
  10. cout<<endl;

Con bucles ( y aplicando lo comentado anteriormente tambien ):

Código
  1. for ( int i = 0; i < 5; i++ )
  2. {
  3.  cout << "Usuario " << i << ": " << persona[ i ].cedula
  4.                                  << " , " << persona[ i ].nombre
  5.                                  << " , " << persona[ i ].correo
  6.                                  << " , " << persona[ i ].telefono
  7.                                  << " , " << persona[ i ].padres[ i ].cedula
  8.                                  << " , " << persona[ i ].padres[ i ].nombre
  9.                                  << " , " << persona[ i ].padres[ i ].cedula // duplicado
  10.                                  << " , " << persona[ i ].padres[ i ].nombre // duplicado
  11.                                  << endl;
  12. }

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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Archivos, Registros en c/c++
Programación C/C++
programador10 3 6,026 Último mensaje 14 Junio 2011, 16:11 pm
por programador10
Pequeño inconveniente archivos/registros
Programación C/C++
reeyesg 3 1,807 Último mensaje 24 Enero 2014, 17:12 pm
por reeyesg
Pedido o ayuda ARCHIVOS/REGISTROS
Programación C/C++
reeyesg 1 1,585 Último mensaje 10 Febrero 2014, 18:40 pm
por ivancea96
Problema - Registros y archivos
Programación C/C++
jaxoR 6 2,859 Último mensaje 6 Noviembre 2014, 13:33 pm
por eferion
archivos y registros
Programación C/C++
kjg 1 1,496 Último mensaje 13 Diciembre 2016, 21:12 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines