Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ayuda

Estas en el tema de Ayuda en el foro de C/C++ en Foros del Web. Hola. Estoy intentando hacer una especie de agenda de numeros de telefono. Solo he escrito parte del codigo, pero no me funciona. No me da ...
  #1 (permalink)  
Antiguo 13/07/2008, 09:16
 
Fecha de Ingreso: julio-2008
Mensajes: 25
Antigüedad: 15 años, 9 meses
Puntos: 0
Ayuda

Hola. Estoy intentando hacer una especie de agenda de numeros de telefono. Solo he escrito parte del codigo, pero no me funciona. No me da problemas al compilar, pero cuando escribo 1 (es la unica opcion del switch que hice por el momento) el programa deja de funcionar.
Se supone que el programa:
1)lee de archivo el numero de contactos
2)reserva memoria para guardar los contactos del archivo mas el que yo quiero añadir en un array de estructuras
3)guarda en el array los datos del fichero
4) me pide que introduzca los datos del nuevo contacto
5)borra los datos del archivo
6)guarda el array en el archivo

Me interesa que le programa trabaje de esta forma. No se si lo que he hecho es lo mas eficiente o no, lo que me interesa es saber por que no funciona y como solucionarlo. Pongo el codigo abajo.
Un saludo.



#include <stdio.h>
#include <stdlib.h>
#define MAX 30

struct datos
{
char nombre[MAX];
int fijo;
int movil;
};

void borra_buffer_teclado();

int main(int argc, char *argv[])
{
int opcion, i;
int datos_agenda; //el numero de contactos que tenemos en nuestra agenda
struct datos *contactos;
FILE *fichero;

printf("**************Escoja una opcion**************\n\n");
printf("1)Introducir un nuevo contacto\n");
printf("2)Borrar un contacto\n");
printf("3)Modificar un contacto\n");
printf("4)Informacion sobre la agenda\n");
printf("5)Salir\n");

do
{
scanf("%i", &opcion);
if(opcion <= 0 || opcion > 5)
printf("Opcion incorrecta. Por favor, escoja una opcion de nuevo\n");
}
while(opcion <= 0 || opcion > 5);

switch(opcion)
{
case 1:

fichero = fopen("datos.txt", "r"); //Guardamos los contactos del archivo en un array de estructuras
if(fichero == NULL)
printf("\nERROR\n");
else
{
fscanf(fichero, "%i", &datos_agenda);
contactos = (struct datos*)malloc(sizeof(struct datos)*datos_agenda++);
for(i=0; i<datos_agenda; i++)
{
fscanf(fichero, "%29[^\n]", contactos[i].nombre);
fscanf(fichero, "%i", contactos[i].fijo);
fscanf(fichero, "%i", contactos[i].movil);
}
printf("\tIntroduzca el nombre\n"); //Introducimos los datos del nuevo contacto
borra_buffer_teclado();
scanf("\t%29[^\n]", contactos[i++].nombre);
printf("\tIntroduzca el numero de telefono fijo");
scanf("\t%i", &contactos[i++].fijo);
printf("\tIntroduzca el numero del telefono movil");
scanf("\t%i", &contactos[i++].movil);
}
fclose(fichero);

fichero = fopen("datos.txt", "w"); //Borramos los datos contenidos en el fichero
for(i=0; i<datos_agenda; i++)
{
fprintf(fichero, " ");
}
fprintf(fichero, "%i", datos_agenda++); //Guardamos los contactos en el archivo
for(i=0; i<datos_agenda++; i++)
{
fprintf(fichero, "%s\t", contactos[i].nombre);
fprintf(fichero, "%i\t", contactos[i].fijo);
fprintf(fichero, "%i\n", contactos[i].movil);
}
fclose(fichero);
free(contactos);

}

system("PAUSE");
return 0;
}
  #2 (permalink)  
Antiguo 13/07/2008, 09:51
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: Ayuda

Ante nada, una recomendación:
Si puedes partir el flujo de tu programa en 6 partes, probablemente puedes llevar esas seis partes a funciones distintas, de manera que tu código sea mas facil de leer, y cuando falle puedas ir a buscarlo de manera más sencilla.
Por ejemplo, podrias hacer algo como:

Código:
#include <stdio.h>
#include <stdlib.h>
#define MAX 30

struct datos               
{
       char nombre[MAX];
       int fijo;
       int movil;
};

void borra_buffer_teclado();

int main(int argc, char *argv[])
{
  int opcion, i;
  int datos_agenda;   //el numero de contactos que tenemos en nuestra agenda
  struct datos *contactos;
  FILE *fichero;
  
imprimirMenu();

opcion = obtenerOpcion();

  switch(opcion)
  {
      case 1:
                      
           fichero = fopen("datos.txt", "r");
if(fichero == NULL)
               printf("\nERROR\n");
           else{
datos_agenda = getDatosAgenda(fichero);
contactos = getContactos(fichero,datos_agenda);
introducirNuevoContacto(contactos);
}
           fclose(fichero);                                          
           
....
  }  
  
  system("PAUSE");	
  return 0;
}
Ahora, independientemente de lo anterior, ¿sabes en que lugar falla? ¿solo deja de funcionar o te da un error?
Para averiguar donde falla no se si hay una forma más feliz de debuggear en C (salvo con herramientas de debug que me parecen igual de infelices =P) que usar printf's en aquellos lugares donde piensas que puede fallar.

Particularmente imprimiria algo por pantalla dentro del do/while que lee los caracteres, y luego dentro de las partes importantes del switch.

Suerte!
__________________
Saludoss
Guille
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:59.