Ayudemen a encontrar el error!!!!

Iniciado por <<<-Basura->>>, 29 Julio 2011, 09:31 AM

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

<<<-Basura->>>

Miren tengo este código :

main.cpp:

Código (cpp) [Seleccionar]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;

#define NOMBRE 20
#define BUFFER 50
const char exten[] = ".datos" ;

struct regis{
string nombre;
string contra;
};

#include "funciones.hpp"
int main(){
Menu();
return 0;
}


y fichero.hpp:

Código (cpp) [Seleccionar]

void ver(){
FILE *fichero;
printf("Nombre del fichero que quiere abrir: ");
char nombre[NOMBRE];
cin >> nombre;
char buffer[BUFFER];
memset(buffer,0,BUFFER);
strcat(buffer,nombre);
strcat(buffer,exten);
regis recuperar;
if ( ( fichero = fopen (buffer , "r") ) != NULL ){
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;
}
printf("fichero Cerrado...\n");
fclose(fichero);
}else{
printf("Error... Fichero no existe Porfavor Creelo.. \n");
}

}

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");
}
}
void guardar(regis *registro){
cout<<"Nombre: " << registro->nombre << endl;
cout<<"Contraseña: "<<registro->contra<< endl;
FILE *fichero;
cout << "Nombre del archivo: ";
char nombre[NOMBRE];
cin >> nombre;
char buffer[BUFFER];
memset(buffer,0,BUFFER);
strcat(buffer,nombre);
strcat(buffer,exten);
if( (fichero = fopen(buffer,"r"))!= NULL ){
printf("Fichero ya existe.. desea sobrescribirlo..??\n");
fclose(fichero);
printf("1. Si\n"
   "2. No\n");
int elegir;
cin >> elegir;
switch(elegir){
case 1:
almacenar(fichero,buffer,registro);
break;
case 2:
printf("Funcion terminada...\n");
return;
break;
default:{
printf("Error....");
exit(1);
}
}
}else{
almacenar(fichero,buffer,registro);
}
}
regis registrarse(){
regis registro;
cout << "Nombre: ";
cin >> registro.nombre;
cout << "Contraseña: ";
cin >> registro.contra;
printf("Registrado...\n");
return registro;
}

void Menu(){
regis registro;
printf("\nDiccionario de contraseñas: \n"
   "1. Registrarse\n"
   "2. Guardar\n"
   "3. Ver\n"
   "4. Salir\n"
   ">> ");
int elegir;
cin >> elegir;
switch(elegir){
case 1:
printf("Registrandose....\n");
registro = registrarse();
Menu();
break;
case 2:
printf("Guardando....\n");
guardar(&registro);
Menu();

break;
case 3:
printf("Viendo...\n");
ver();
Menu();
break;
case 4:
exit(1);
break;
default:
printf("Error...!!\n");
}
}


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

Flakito81

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