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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayudemen a encontrar el error!!!!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayudemen a encontrar el error!!!!  (Leído 2,178 veces)
<<<-Basura->>>


Desconectado Desconectado

Mensajes: 388



Ver Perfil
Ayudemen a encontrar el error!!!!
« en: 29 Julio 2011, 09:31 am »

Miren tengo este código :

main.cpp:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. #define NOMBRE 20
  8. #define BUFFER 50
  9. const char exten[] = ".datos" ;
  10.  
  11. struct regis{
  12. string nombre;
  13. string contra;
  14. };
  15.  
  16. #include "funciones.hpp"
  17. int main(){
  18. Menu();
  19. return 0;
  20. }
  21.  

y fichero.hpp:

Código
  1. void ver(){
  2. FILE *fichero;
  3. printf("Nombre del fichero que quiere abrir: ");
  4. char nombre[NOMBRE];
  5. cin >> nombre;
  6. char buffer[BUFFER];
  7. memset(buffer,0,BUFFER);
  8. strcat(buffer,nombre);
  9. strcat(buffer,exten);
  10. regis recuperar;
  11. if ( ( fichero = fopen (buffer , "r") ) != NULL ){
  12. fread(&recuperar,sizeof(regis),1,fichero);
  13. printf("\n Contenido del Fichero: \n\n");
  14. while(!feof(fichero)){
  15. cout<<"Nombre: \t"<<recuperar.nombre<<endl;
  16. cout<<"Contraseña: \t"<<recuperar.contra<<endl;
  17. }
  18. printf("fichero Cerrado...\n");
  19. fclose(fichero);
  20. }else{
  21. printf("Error... Fichero no existe Porfavor Creelo.. \n");
  22. }
  23.  
  24. }
  25.  
  26. void almacenar(FILE *fichero,char buffer[],regis *registro){
  27. if((fichero = fopen(buffer,"w")) != NULL ){
  28. printf("Creado Con exito...\n");
  29. fwrite(&registro,sizeof(regis),1,fichero);
  30. fclose(fichero);
  31. }else{
  32. printf("Error al Crear fichero...\n");
  33. }
  34. }
  35. void guardar(regis *registro){
  36. cout<<"Nombre: " << registro->nombre << endl;
  37. cout<<"Contraseña: "<<registro->contra<< endl;
  38. FILE *fichero;
  39. cout << "Nombre del archivo: ";
  40. char nombre[NOMBRE];
  41. cin >> nombre;
  42. char buffer[BUFFER];
  43. memset(buffer,0,BUFFER);
  44. strcat(buffer,nombre);
  45. strcat(buffer,exten);
  46. if( (fichero = fopen(buffer,"r"))!= NULL ){
  47. printf("Fichero ya existe.. desea sobrescribirlo..??\n");
  48. fclose(fichero);
  49. printf("1. Si\n"
  50.   "2. No\n");
  51. int elegir;
  52. cin >> elegir;
  53. switch(elegir){
  54. case 1:
  55. almacenar(fichero,buffer,registro);
  56. break;
  57. case 2:
  58. printf("Funcion terminada...\n");
  59. return;
  60. break;
  61. default:{
  62. printf("Error....");
  63. exit(1);
  64. }
  65. }
  66. }else{
  67. almacenar(fichero,buffer,registro);
  68. }
  69. }
  70. regis registrarse(){
  71. regis registro;
  72. cout << "Nombre: ";
  73. cin >> registro.nombre;
  74. cout << "Contraseña: ";
  75. cin >> registro.contra;
  76. printf("Registrado...\n");
  77. return registro;
  78. }
  79.  
  80. void Menu(){
  81. regis registro;
  82. printf("\nDiccionario de contraseñas: \n"
  83.   "1. Registrarse\n"
  84.   "2. Guardar\n"
  85.   "3. Ver\n"
  86.   "4. Salir\n"
  87.   ">> ");
  88. int elegir;
  89. cin >> elegir;
  90. switch(elegir){
  91. case 1:
  92. printf("Registrandose....\n");
  93. registro = registrarse();
  94. Menu();
  95. break;
  96. case 2:
  97. printf("Guardando....\n");
  98. guardar(&registro);
  99. Menu();
  100.  
  101. break;
  102. case 3:
  103. printf("Viendo...\n");
  104. ver();
  105. Menu();
  106. break;
  107. case 4:
  108. exit(1);
  109. break;
  110. default:
  111. printf("Error...!!\n");
  112. }
  113. }
  114.  

el problema que tengo es que cuando se va a la función guardar, puse para ver si me pasaba la variable regis, y no la pasa alguien me podría decir porque es ??..

también cuando trato de guardarla en el fichero no se guarda y cuando trato de verla en el fichero me pasa un bucle infinito con el !feof(fichero)...


En línea

<<<--Basura-->>>
Flakito81


Desconectado Desconectado

Mensajes: 519



Ver Perfil
Re: Ayudemen a encontrar el error!!!!
« Respuesta #1 en: 30 Julio 2011, 00:53 am »

Hola !!

No he compilado tu código asi que lo que te puedo decir son los errores que saltan a simple vista.

1- Por simple estética deberías de usar C o C++ porque si mezclas las cosas no solo estás haciendo el código sino que desaprovechas las funcionalidades del C++.

2- regis no es un tipo de dato, asi que tienes dos opciones:
2.1 haces que sea un tipo de dato con algo como:
typedef struct regis tiporegistro;
y luego declaras las variables como:
tiporegistro registro;
2.2- declaras las variables de esa estructura:
struct regis registro;

3- string no es un tipo de dato sino una clase asi que te recomiendo que uses char *dato, o bien char dato[TAMANYO]

4- Si tienes la variable registro en la función menu es para usar esa información en cualquier parte, por tanto utiliza las referencias en vez de retornar el valor (funcion registrarse). Es más si quieres asignar el valor retornado a tu variable registro tendrás que retornar el puntero, o bien sobrecargar el operador asignación. Date cuenta que registro es una variable definida por ti asi que el compilador no tiene ni idea de lo que hacer.

5-
   memset(buffer,0,BUFFER);
   strcat(buffer,nombre);
   strcat(buffer,exten);

Todo eso lo podrías ahorrar empreando la función sprintf o bien concatenando las diferentes cadenas en una variable del tipo string y luego usar el método c_str() para transformarlo a char *.

6-
fread(&recuperar,sizeof(regis),1,fichero);
printf("\n Contenido del Fichero: \n\n");
while(!feof(fichero)){
....cout<<"Nombre: \t"<<recuperar.nombre<<endl;
....cout<<"Contraseña: \t"<<recuperar.contra<<endl;
FALTA OTRO FREAD
}
Si te das cuenta cuando entras en el bucle no lees mas del fichero por tanto el puntero no avanza y nunca llegará al final del fichero.
Date cuenta que en sizeof pasa lo mismo que lo mencionado en el punto 2

7-
void almacenar(FILE *fichero,char buffer[],regis *registro){
....if((fichero = fopen(buffer,"w")) != NULL ){
........printf("Creado Con exito...\n");
........fwrite(&registro,sizeof(regis),1,fichero);
........fclose(fichero);
....}else{
....printf("Error al Crear fichero...\n");
....}
}
7.1 Pasarle a la funcion el puntero al fichero (FILE*) sobra. Incluso podrías mejorar la funcion guardar y almacenar considerando abrir para añadir al final (fopen("nombre","a"))
7.2 regis tiene el mismo inconveniente que lo comentado en el punto 2, además le estas pasando un puntero, por tanto el ampersand de fwrite sobra.

8- Un problema capital. No puedes estar llamando a la funcion menu desde la propia funcion menu, eso es hacer llamadas recursivas, es decir, que en la pila del sistema estas guardando una copia de todas las variables, direcciones, etc por cada llamada, ademas usar exit no está bien, de hecho si usas exit nunca saldrá de main sino que cierras el programa, dicho de otra manera no regresará a la funcion principal. Una solucion es hacer un bucle, algo como

<declaracion de la variable>
do{
<tu codigo pero sin las llamadas recursivas>
}while (elegir != 4);


Suerte!!


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayudemen por favor
Juegos y Consolas
kaki 5 2,784 Último mensaje 3 Febrero 2005, 05:30 am
por DJ46
MySQL: Ayuda para encontrar el error que tengo. « 1 2 »
PHP
mokoMonster 15 10,069 Último mensaje 13 Octubre 2009, 20:27 pm
por ^Tifa^
CrackMe - HTML-CSS-JS ¿Podeis encontrar el error?
Desarrollo Web
Paniic 5 2,808 Último mensaje 5 Septiembre 2014, 15:36 pm
por WHK
Encontrar error de código.
Programación Visual Basic
Meta 9 3,778 Último mensaje 6 Abril 2015, 20:33 pm
por HdM
Ayuda a encontrar error
Programación C/C++
marcosuag 1 1,707 Último mensaje 7 Agosto 2017, 05:09 am
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines