• Lunes 18 de Noviembre de 2024, 11:49

Autor Tema:  Dudas Con Estructuras Typedef  (Leído 3967 veces)

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Dudas Con Estructuras Typedef
« en: Jueves 28 de Junio de 2007, 22:37 »
0
Hola:
Tengo el siguiente problema. Tengo que hacer un gestor de proyectos en C. Se deben guardar los proyectos en un archivo (proyectos.db), hasta ahora funciona sin problemas, y ademas al crear un proyecto debe haber un archivo para cada proyecto (es decir proyecto1.pro proyecto2.pro... etc).
El problema es que tengo que usar estructuras y no soy muy entendido en punteros asi que prefiero no usarlos.
El problema es que necesito hacer un array de estructuras para poder elegir el proyecto que quiero modificar, tengo una funcion que llena una estructura con los datos del archivo proyectos.db pero al imprimirlas por pantalla no muestran nada. El codigo de algunas partes es:

Código: Text
  1. typedef struct {
  2.   char nombre[max];
  3.   char desc[max];
  4.   char loc[max];
  5. }project;
  6. project pos[max1] //donde max1=100
  7.  
  8. .
  9. .
  10. .
  11.  
  12. //Tengo entendido que debiera funcionar con esto:
  13.  
  14. project read_structure(){
  15. //Puntero al archivo...
  16. char line[100];
  17. FILE *id;
  18.  
  19. int i=-1;
  20. int count=0;
  21. char str;
  22. project pos;
  23.      id=fopen("proyectos.db","r");
  24.      while (!feof(id)){
  25.              fgets(line,max1,id);
  26.              i++;
  27.              switch (i) {
  28.                   case 1:{strcpy(pos[count].nombre,line);break;}
  29.                   case 2:{strcpy(pos[count].desc,line);break;}
  30.                   case 3:{strcpy(pos[count].loc,line);break;}
  31.                   default:{/*Leera el delimitador, por lo tanto debemos agregar un proyecto nuevo.*/
  32.                        count++;
  33.                        i=-1;break;
  34.                           }
  35.                         }
  36.                        }
  37.                        return(pos);
  38. }
  39.  
Sin embargo no lee nada. Espero que me puedan ayudar
salu2
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

LeGatoRojo

  • Miembro HIPER activo
  • ****
  • Mensajes: 552
  • Nacionalidad: mx
    • Ver Perfil
    • LeGatoRojo
Re: Dudas Con Estructuras Typedef
« Respuesta #1 en: Jueves 28 de Junio de 2007, 23:17 »
0
Puedes intentar usar un archivo binario para empezar, asi la lectura del archivo sea correcta, en la manera en que lo hace tan solo lees 100 caracteres y los pones en cada uno de los campos, asi podrías usar fread();
Un día desperte y en lugar de dientes tenía colmillos, en lugar de manos, tenía garras; pero lo más impactante fue el color escarlata de mi pelaje.

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #2 en: Jueves 28 de Junio de 2007, 23:36 »
0
Cita de: "Darktigerhell"
Puedes intentar usar un archivo binario para empezar, asi la lectura del archivo sea correcta, en la manera en que lo hace tan solo lees 100 caracteres y los pones en cada uno de los campos, asi podrías usar fread();
La verdad, no tengo problemas en la escritura del archivo. El problema radica en obtener los datos de los campos en la estructura, ya que cuando lo hace no muestra nada.
Que se puede hacer??
Salu2 y gracias de todas maneras
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

cris_maco

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #3 en: Jueves 28 de Junio de 2007, 23:46 »
0
pero si solo has creado un struct como es que lo usas como si fuera un array de struct? me explico:
 creas project pos, que es una estructura
pero luego haces esto pos[count].nombre y eso es un array de estructuras project y no las has creado.

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #4 en: Jueves 28 de Junio de 2007, 23:49 »
0
Cita de: "cris_maco"
pero si solo has creado un struct como es que lo usas como si fuera un array de struct? me explico:
 creas project pos, que es una estructura
pero luego haces esto pos[count].nombre y eso es un array de estructuras project y no las has creado.
Pero si yo creo el array dentro de esa funcion el resto de las funciones del codigo me reconocera el array?????
La lectura del archivo (proyectos.db) y llenado de la estructura, es lo primero que tengo que hacer (en la ejecucion del programa.
saly2 y gracias de antemano
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

cris_maco

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #5 en: Jueves 28 de Junio de 2007, 23:52 »
0
perdona, es que no veo donde has creado el array de struct

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #6 en: Viernes 29 de Junio de 2007, 00:00 »
0
Cita de: "cris_maco"
perdona, es que no veo donde has creado el array de struct
La verdad lo tengo definido poco mas abajo de los includes, despues de definir la estructura...
salu2
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #7 en: Viernes 29 de Junio de 2007, 00:05 »
0
Esta es la salida del programa

Código: Text
  1.  
  2. Estos son los proyectos.        Proyecto N║ 0
  3.         ------------------
  4.  
  5.  
  6.  
  7. -----------------------------------------------
  8.  
  9.         Proyecto N║ 1
  10.         ------------------
  11.  
  12.  
  13.  
  14. -----------------------------------------------
  15.  
  16.         Proyecto N║ 2
  17.         ------------------
  18.  
  19.  
  20.  
  21. -----------------------------------------------
  22.  
  23.         Proyecto N║ 3
  24.         ------------------
  25.  
  26.  
  27.  
  28. -----------------------------------------------
  29.  
  30.         Proyecto N║ 4
  31.         ------------------
  32.  
  33.  
  34.  
  35. -----------------------------------------------
  36.  
  37.         Proyecto N║ 5
  38.         ------------------
  39.  
  40.  
  41.  
  42. -----------------------------------------------
  43.  
  44.         Proyecto N║ 6
  45.         ------------------
  46.  
  47.  
  48.  
  49. -----------------------------------------------
  50.  
  51. Con cual de ellos desea trabajar?
  52.  
  53.  

Abajo de cada proyecto deberia aparecer los datos de los proyectos, de la siguiente manera (o mas menos)

Citar
Nombre:hola

 Descripcion:Esto es una prueba

 Ubicacion:proyectos/hola

 ---------------------------------------------------------------

 Nombre:hola

 Descripcion:nuevamente es una prueba

 Ubicacion:proyectos/hola

 ---------------------------------------------------------------

 Nombre:Blax

 Descripcion:An interesting software

 Ubicacion:proyectos/blax

 ---------------------------------------------------------------

 Nombre:Blax

 Descripcion:an interesting software

 Ubicacion:proyectos/blax

 ---------------------------------------------------------------

 Nombre:Hola

 Descripcion:trabajando con linux

 Ubicacion:proyectos/hola

 ---------------------------------------------------------------

 Nombre:Gprom

 Descripcion:GNU Project manager.

 Ubicacion:/proyectos/gprom

 ---------------------------------------------------------------

 Nombre:Ktechlab

 Descripcion:Kde electronic suite

 Ubicacion:proyectos/ketchlab

 ---------------------------------------------------------------

 ---------------------------------------------------------------

 Cantidad de registros= 7
Presione una tecla para continuar...


salu2
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #8 en: Viernes 29 de Junio de 2007, 00:09 »
0
Como el programa es GPL les dejo el codigo

Citar
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define null 0
#define max 80
#define max1 100
char c;
//Para manejar errores...
//hacemos una estructura global (typedef) para los proyectos (proyectos.db)
typedef struct {
   char nombre[max];
   char desc[max];
   char loc[max];
}project;
project pos[max1];

/*******************************************
*Definicion de funciones para el programa  *
*******************************************/
void main_menu();
void new_project();
void edit();
int listing();
project read_structure();
int select();
/******************************************/

project read_structure(){
//Puntero al archivo...
char line[100];
FILE *id;

int i=-1;
int count=-1;
          id=fopen("proyectos.db","r");
          while (!feof(id)){
             fgets(line,max1,id);
             i++;
             count++;
             switch (i) {
                 case 1:{strcpy(pos[count].nombre,line);break;}
                 case 2:{strcpy(pos[count].desc,line);break;}
                 case 3:{strcpy(pos[count].loc,line);break;}
                 default:{/*Leera el delimitador, por lo tanto debemos agregar un proyecto nuevo.*/
                      count++;
                      i=-1;break;
                      }
                      }

                      }
                      return (pos[count]);
}
/*****************************************************************************************/
int select(){
    int location=0,i=0;
    int position;
            position=listing();
            printf("\t\tSeleccionar proyecto\n\t\t--------------------------\n");
            printf("Estos son los proyectos.");
            for (i=0;i<position;i++){
                printf("\tProyecto Nº %d\n\t------------------\n",i);
                printf("%s\n",pos.nombre);
                printf("%s\n",pos.desc);
                printf("%s\n",pos.loc);
//Ahora el programa debe leer un delimitador. Para ello usamos printf
                printf("-----------------------------------------------\n\n");
                }//for
             printf("Con cual de ellos desea trabajar?\n->");
             scanf("%d",&location);
             printf("Estara trabajando con el proyecto %d",location);
             printf("\nPresione una tecla para continuar.");
             getchar();
             return location;
}


int listing()
{
/******************************************************************************************
LISTING()
---------
 Procedimiento que imprime por pantalla los datos del archivo de proyectos. Si no encuentra
el archivo, envia una señal de error
*******************************************************************************************/


char line[100];
//Puntero al archivo...
FILE *id;
int count=0;
int countreg=0;
   id=fopen("proyectos.db","r");
//Chequeamos si el archivo existe...Es extraño. En windows funciona bien. Aqui se ve feo.
             if (id==null)
             {
                           system("cls");
                           printf("Error 404. Archivo no encontrado.\n\a\nAgregar entradas primero.\nPresione una tecla para continuar");
                           c=getchar();
                           main_menu();
                           }
//Leemos el archivo hasta el final de su contenido.
             system("cls");
             while (!feof(id)){
                           fgets(line,100, id);
                           count++;
                           printf("%s\n ",line);
                           
                           if (count==4){
                              count=0;
                              countreg++;
                              }
                           }
             fclose(id);
             printf("Cantidad de registros= %d\n",countreg);
             printf("Presione una tecla para continuar...\n");
             c=getchar();
             return countreg;
}



//------------------------------------------------------------------------------

void edit_menu() {
int opt;
   do {
  do{
     system("cls");
        printf("\n      Editar Archivo \n");
        printf(" ------------------------------------------------------------- \n");
        printf("\n 1.- Mostrar la Lista de Archivos \n 2.- Agregar Archivo \n 3.- Eliminar Archivo \n 4.-Guardar Archivo \n 5.- Volver al Menu Principal \n\n");
        printf(" ------------------------------------------------------------- \n");
        printf("Elija la opcion que desee realizar: ");
     scanf("%d",&opt);
       switch (opt){
    case 1:{;break;}
    case 2:{;break;}
    case 3:{;break;}
    case 4:{;break;}
    case 5:{;break;}
    case 6:{system("cls");return;break;}
    default :{system("cls");getchar();break;}
  }

  }while (opt<1 || opt>6);
   }while (getchar(), getchar() != 'n');

}



//------------------------------------------------------------------------------

int main()
{
    project pos[max1];
   system("cls");
    read_structure();
   main_menu();

return 0;
}
//------------------------------------------------------------------------------
void main_menu(){
int opt;
int location;
do
{   
   do{
  system("cls");
  printf("Bienvenido al gestor de proyectos\n\n");
     printf("Ingrese una opcion\n\n");
    printf("\t 1.- Crear.\n\t 2.- Listar.\n\t 3.- Seleccionar.\n\t 4.- Eliminar.\n\t 5.- Editar.\n\t 6.- Salir.\n");
    scanf("%d",&opt);
    switch (opt){
     case 1:{new_project();break;}
     case 2:{listing();break;}
     case 3:{location=select();break;}
     case 4:{;break;}
     case 5:{edit_menu();break;}
     case 6:{system("cls");return;break;}
     default :{system("cls");getchar();break;}
  }
   }while(opt < 1 || opt > 6);
}while(getchar(), getchar() != 'n');
}

//------------------------------------------------------------------------------
void new_project(){
char dummy[50];
/************************************************************************************************
NEW_PROJECT()
-------------
 Procedimiento que permite al usuario crear un proyecto y guardarlo en el archivo proyectos.db.
*************************************************************************************************/

//Pedimos los datos al usuario
        project new_project;
        system("cls");
      printf("\t\tCreacion de proyectos\n\t\t------------------------------\n");
      printf("\tIngrese el nombre del proyecto\n");
     scanf("%s[^\n]",new_project.nombre);
     gets(dummy);
     printf("\tIngrese la descripcion\n");
        gets(new_project.desc);
        //scanf("%s[^\n]",new_project.desc);
     printf("\tIngrese la ubicacion del proyecto\n");
     scanf("%s[^\n]",new_project.loc);

//Ya tenemos los datos del proyecto. Ahora escribimos en el archivo
    FILE *id;
   id=fopen("proyectos.db","a");
   fprintf(id,"Nombre:%s\n",new_project.nombre);
   fprintf(id,"Descripcion:%s\n",new_project.desc);
   fprintf(id,"Ubicacion:%s\n",new_project.loc);
   //Delimitador...
   fprintf(id,"---------------------------------------------------------------\n");
   fclose(id);
   return;
//El archivo esta escrito...
}//End new project
Y debo decir que me falta mas de la mitad
jajajaja
salu2 y gracias
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

cris_maco

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #9 en: Viernes 29 de Junio de 2007, 00:09 »
0
probaste a que esta bien escrito en el fichero binario y que luego lo lees bien? Me refiero a antes de meterlo en los campos del struct.

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #10 en: Viernes 29 de Junio de 2007, 00:12 »
0
Cita de: "cris_maco"
probaste a que esta bien escrito en el fichero binario y que luego lo lees bien? Me refiero a antes de meterlo en los campos del struct.

La verdad es que no me gusta mucho que llames igual a las 2 variables de struct, la del array y la otra.
Si lee bien, de hecho, hay una opcion que se llama listar. Esta funcion muestra el contenido del archivo de proyectos asi que en ese sentido no hay problemas, pero cuando quiero leer del archivo y pasar lo leido a los campos de la estructura, simplemente no hace nada.

salu2 y gracias
pd:sorry la insistencia pero tengo que entregar esta basura mañana-....Agggggggghhhhh
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #11 en: Viernes 29 de Junio de 2007, 00:21 »
0
Puedo hacer un array de estructuras, pero de manera local nada mas y tengo que hacerlo con un array global. Damn!
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

cris_maco

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #12 en: Viernes 29 de Junio de 2007, 00:24 »
0
cosas que se me ocurren:

1 intentas meter 100 caracteres en una de 80, es decir line es de 100 pero los campos de tu estructura son de 80.
2 has visto si la variable pos en read_project almacena bien el valor de line o es ahi donde te da problemas?

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #13 en: Viernes 29 de Junio de 2007, 00:30 »
0
Cita de: "cris_maco"
cosas que se me ocurren:

1 intentas meter 100 caracteres en una de 80, es decir line es de 100 pero los campos de tu estructura son de 80.
2 has visto si la variable pos en read_project almacena bien el valor de line o es ahi donde te da problemas?
Parece que es ahi donde esta el problema, por que la salida del programa esta en blanco.


salu2 y muchisimas gracias
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

cris_maco

  • Nuevo Miembro
  • *
  • Mensajes: 16
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #14 en: Viernes 29 de Junio de 2007, 00:35 »
0
Otras cosas que se me ocurren:

Para que usas c como global??? porque dices que es para errores, pero para que la quieres global?
no entiendo que devuelvas la estructura pos que es global en la funcion read_structure, porque la variable es global y la ve todo el programa.
me ha parecido ver por ahi recursividad llamando a la funcion main_menu, ya puede tener cuidado.

no entendi lo que digiste del array de estructuras, tiene que ser global o local?

si es local, ya sabes que lo tendras que ir pasando de una funcion a otra, si es global no porque lo vera todo el programa, mira a ver cuando lo modificas y cuando lo lees.

Lo siento pero es que aqui en España son las 0:35 y me esta dando el sueño.
Espero que te salga bien

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #15 en: Viernes 29 de Junio de 2007, 00:48 »
0
Ya descubri el problema, y esta en la asignacion a los campos de la estructura. Como aparece alli estoy asignando las cadenas con fgets pero no funciona los campos aparecen vacios...
Muy extraño...
salu2 y gracias
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...

LeGatoRojo

  • Miembro HIPER activo
  • ****
  • Mensajes: 552
  • Nacionalidad: mx
    • Ver Perfil
    • LeGatoRojo
Re: Dudas Con Estructuras Typedef
« Respuesta #16 en: Viernes 29 de Junio de 2007, 03:25 »
0
Citar
La verdad, no tengo problemas en la escritura del archivo. El problema radica en obtener los datos de los campos en la estructura, ya que cuando lo hace no muestra nada.
Que se puede hacer??
Salu2 y gracias de todas maneras

fread es para leer no para escribir, y te decia que si guardabas los datos de esa manera no tendrias  problemas con tus fgets() que como comente lo asigna equitativamente a tus tres variables de la estructura, en pocas palabras cmabiando de metodo tan solo tendrías que hacer una lectura que te asignaria por si sola los datos y lo demas es como poner un numero en un array.

 :hola:
Un día desperte y en lugar de dientes tenía colmillos, en lugar de manos, tenía garras; pero lo más impactante fue el color escarlata de mi pelaje.

Hammerstrike

  • Miembro activo
  • **
  • Mensajes: 27
    • Ver Perfil
Re: Dudas Con Estructuras Typedef
« Respuesta #17 en: Sábado 30 de Junio de 2007, 19:51 »
0
Cita de: "Darktigerhell"
Citar
La verdad, no tengo problemas en la escritura del archivo. El problema radica en obtener los datos de los campos en la estructura, ya que cuando lo hace no muestra nada.
Que se puede hacer??
Salu2 y gracias de todas maneras

fread es para leer no para escribir, y te decia que si guardabas los datos de esa manera no tendrias  problemas con tus fgets() que como comente lo asigna equitativamente a tus tres variables de la estructura, en pocas palabras cmabiando de metodo tan solo tendrías que hacer una lectura que te asignaria por si sola los datos y lo demas es como poner un numero en un array.

 :hola:
Thnx bro!!!!
salu2
Se que me puedes ver. No me puedes oir. Pero lo que hiciste no tiene NOMBRE...
Terminaste por cerrar hasta la mas minima ventana que habia entre nosotros...