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.
pero si solo has creado un struct como es que lo usas como si fuera un array de struct? me explico:Pero si yo creo el array dentro de esa funcion el resto de las funciones del codigo me reconocera el array?????
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.
perdona, es que no veo donde has creado el array de structLa verdad lo tengo definido poco mas abajo de los includes, despues de definir la estructura...
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...
#include <stdio.h>Y debo decir que me falta mas de la mitad
#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
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.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.
La verdad es que no me gusta mucho que llames igual a las 2 variables de struct, la del array y la otra.
cosas que se me ocurren:Parece que es ahi donde esta el problema, por que la salida del programa esta en blanco.
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?
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
Thnx bro!!!!CitarLa 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: