• Martes 12 de Noviembre de 2024, 20:57

Autor Tema:  Re: Archivos En C  (Leído 2314 veces)

joelrosental

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Archivos En C
« en: Sábado 17 de Julio de 2004, 04:33 »
0
Saludos,

Bueno tengo el siguiente problema, tengo un archivo secuencial con registros, necesito leer el contenido de ese archivo, especificamente uno de los campos (codigo), para poder hacer una validacion al dar de alta un registro.

Estoy utilizando la funcion fscanf() pero no sirve, se me queda en un loop infinito, a continuacion les coloco el codigo:

#include <stdio.h>
#include "funcion.h"

int main() {
FILE *prueba;
registro regprueba;

prueba = fopen("/ruta/al_archivo/archivo.txt","r");
while (!feof(prueba)) {
fscanf(prueba,"%d",®prueba.codigo);
printf ("%d",regprueba.codigo);
}
fclose (prueba);
return 0;
}

donde funcion.h es un archivo creado por mi que contiene otras funciones mas, que no vienen al caso, y contienen la estructura de los registros que tambien coloco a continuacion:

typedef struct {
int codigo;
char descripcion[30];
char unidad;
int cantidad_disponible;
int cantidad_reservada;
int cantidad_pedida;
float costo;
float precio;
float beneficio;
float total;
}registro;

El codigo de arriba es solo una prueba que estaba haciendo para ver si podia leer bien el campo codigo de los registros, pero como ya les dije, no puedo.

¿Alguien tiene idea de que pueda estar pasando?

Electroduende

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Archivos En C
« Respuesta #1 en: Martes 20 de Julio de 2004, 18:35 »
0
Hola  :D

si lo que quieres es cargar los datos de una estructura que has guardado en fichero, puedes utilizar
fread(®prueba, sizeof(struct registro), 1, prueba);

asi te cargas toda la estructura del fichero de un plumazo. Luego accedes a los miembros de la estructura que te interesen. Si no lo haces asi, tienes que tener en cuenta el formateo de los campos dentro del fichero.

Hasta luego,
Electroduende

Nirvana

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
Re: Archivos En C
« Respuesta #2 en: Jueves 22 de Julio de 2004, 05:53 »
0
Igual despues deberias utilizar un puntero para apuntar al campo especifico al que queres apuntar.  :comp:
.........."Todo pasa"............

rocho09

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Archivos En C
« Respuesta #3 en: Jueves 22 de Julio de 2004, 08:20 »
0
:D Hola creo te estas complicando demasiado las cosas te envio codigo de una agenda q emplea el mismo concepto que estas buscando, checa las funciones de separa y de carga_registro, para que después las apliques a tu programa

Espero te funcione


#include<ctype.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>

struct directorio
{
   int id_agenda;
   char nombre[100];
   char direccion[200];
   char telefono[20];
   char e_mail[100];
};

int folio=0;
FILE *arch_salida, *archivo;

void salir(struct directorio *agenda)
{
   char registro[450],id[4];
   struct directorio paso;
   char path[250];
   sprintf(path,"c:\\registros.txt");
   if((arch_salida=fopen(path,"w"))==NULL)
      printf("\tError al abrir el archivo");
   else
   {
      for(int i=0;i<folio;i++)
      {
         strcpy(registro,"\0");
         strcpy(id,"\0");
         sprintf(id,"%d",i+1);
         strcat(id,"|");
      
         strcpy(paso.nombre,(agenda+i)->nombre);
         strcpy(paso.direccion,(agenda+i)->direccion);
         strcpy(paso.telefono,(agenda+i)->telefono);
         strcpy(paso.e_mail,(agenda+i)->e_mail);

         strcat(paso.nombre,"|");
         strcat(paso.direccion,"|");
         strcat(paso.telefono,"|");
         strcat(paso.e_mail,"\n");
   
         strcat(registro,id);
         strcat(registro,paso.nombre);
         strcat(registro,paso.direccion);
         strcat(registro,paso.telefono);
         strcat(registro,paso.e_mail);
      
         fputs(registro,arch_salida);
      }
         fclose(arch_salida);
   }
   printf("\n\n\t***** Datos Actualizados ***** \n");
}



int ordena(const void *a, const void *B)
{

  struct directorio *ap_a;
  struct directorio *ap_b;
  ap_a=(struct directorio*)a;
  ap_b=(struct directorio*)b;
  return (strcmp(ap_a->nombre, ap_b->nombre));
}


int cuenta_registros(void)
{
   int cont_reg=0;
   char registro[450];
   if((archivo=fopen("c:\\registros.txt","r"))==NULL)
   {
      printf("\nError: Archivo no leido\n");
   }
   else
   {
      while((fgets(registro,450,archivo))!=NULL)
      {
         cont_reg++;
      }
      fclose(archivo);
   }
   return (cont_reg);
}

struct directorio separa(char *registro)
{
   char campo[100], letra[2];
   int longitud=0, pos, cont=0, id_a=0;
   struct directorio alumno;

   longitud= strlen(registro);
   campo[0]='\0';
   for(pos=0; pos<longitud; pos++)
   {
      strcpy(letra,"\0");
      strncpy(letra,registro+pos,1);
      if(letra[0]!='|' && letra[0]!='\n')
      {
         letra[1]='\0';
         strcat(campo,letra);
      }
      else
      {
         cont++;
         if(cont==1)
            id_a=atoi(campo);
            alumno.id_agenda=id_a;
         if(cont==2)
            strcpy(alumno.nombre,campo);
         if(cont==3)
            strcpy(alumno.direccion,campo);
         if(cont==4)
            strcpy(alumno.telefono,campo);
         if(cont==5)
            strcpy(alumno.e_mail,campo);
         strcpy(campo,"\0");
      }
   }
   return(alumno);
}

void cargar(struct directorio *arreglo)
{
   int reg=0;
   char registro[450];
   if((archivo=fopen("c:\\registros.txt","r"))==NULL)
      printf("\nError: Archivo no leido\n");
   else
   {
      printf("\t***** Archivo cargado con exito!!! *****");
      getch();
      while((fgets(registro,450,archivo))!=NULL)
      {
         *(arreglo+reg)=separa(registro);
         reg++;
      }
      fclose(archivo);
   }
   
}

void altas(struct directorio *agenda)
{
   struct directorio datos, *pos_bus;
   fflush(stdin);
   printf("\n\tIntroduce el nombre: ");
   gets(datos.nombre);
   fflush(stdin);
   qsort((void *)agenda, folio, sizeof(agenda[0]), ordena);
   pos_bus=(struct directorio *)bsearch((void *)&datos,(void *)agenda,folio,sizeof(struct directorio),ordena);
   if(pos_bus!=NULL)
   {
      printf("\n\tRegistro encontrado, ya existe, presiona una tecla para continuar...");
      getch();
      strcpy(datos.nombre,"\0");
      return;
   }
   else
   {
      if(folio<50)
      {
         printf("\tDireccion: ");
         gets(datos.direccion);
         printf("\tTelefono: ");
         gets(datos.telefono);
         printf("\tE mail: ");
         gets(datos.e_mail);
         datos.id_agenda=folio+1;
         *(agenda+folio)=datos;
         folio++;
      }
      else
      {
         printf("\tNo hay espacio para otro registro");
         getch();
      }
   }
}

void bajas(struct directorio *agenda)
{
   struct directorio busca,*pos_bus;
   char opc;
   printf("Inserta el nombre del registro a eliminar: ");
   fflush(stdin);
   gets(busca.nombre);
   qsort((void *)agenda, folio, sizeof(agenda[0]), ordena);
   pos_bus=(struct directorio *)bsearch((void *)&busca,(void *)agenda,folio,sizeof(struct directorio),ordena);
   if(pos_bus==NULL)
   {
      printf("No existe algun registro con ese nombre...");
      getch();
      strcpy(busca.nombre,"\0");
      return;
   }
   else
   {
      printf("Id agenda: %d\n",pos_bus->id_agenda);
      printf("Nombre: %s\n",pos_bus->nombre);
      printf("Direccion: %s\n",pos_bus->direccion);
      printf("Telefono: %s\n",pos_bus->telefono);
      printf("E mail: %s\n",pos_bus->e_mail);
   }
   printf("Desea eliminar este registro S o N?\n");
   scanf("%c",&opc);
   if(toupper(opc=='s'))
   {
      pos_bus->id_agenda=NULL;
      *(pos_bus->nombre)=NULL;
      *(pos_bus->direccion)=NULL;
      *(pos_bus->telefono)=NULL;
      *(pos_bus->e_mail)=NULL;
      *(pos_bus)=*(agenda+(folio-1));
      (agenda+(folio-1))->id_agenda=NULL;
      *(agenda+(folio-1))->nombre=NULL;
      *(agenda+(folio-1))->direccion=NULL;
      *(agenda+(folio-1))->telefono=NULL;
      *(agenda+(folio-1))->e_mail=NULL;
      folio--;
      printf("\n\tRegistro borrado satisfactoriamente, presiona una tecla para continuar");
      getch();
     }
}


void consulta(struct directorio *agenda)
{
   struct directorio busca, *pos_bus;
   printf("\tIntroduce el nombre a consultar :");
   fflush(stdin);
   gets(busca.nombre);
   qsort((void *)agenda, folio, sizeof(agenda[0]), ordena);
   pos_bus=(struct directorio *)bsearch((void *)&busca,(void *)agenda,folio,sizeof(struct directorio),ordena);
   if(pos_bus==NULL)
   {
      printf("Nombre no encontrado...");
      getch();
      strcpy(busca.nombre,"\0");
   }
   else
   {
      printf("Id agenda: %d\n",pos_bus->id_agenda);
      printf("Nombre: %s\n",pos_bus->nombre);
      printf("Direccion: %s\n",pos_bus->direccion);
      printf("Telefono: %s\n",pos_bus->telefono);
      printf("E mail: %s\n",pos_bus->e_mail);
   }
}

void visualiza(struct  directorio *agenda)
{
   int i=0;
   for(i=0;i<folio;i++)
   {
      printf("\n\tId agenda: %d\n",(agenda+i)->id_agenda);
      printf("\tNombre: %s\n",(agenda+i)->nombre);
      printf("\tDireccion: %s\n",(agenda+i)->direccion);
      printf("\tTelefono: %s\n",(agenda+i)->telefono);
      printf("\tE mail: %s\n",(agenda+i)->e_mail);
   }
   getch();
}

void menu()
{
   
   struct directorio *agenda;
   int opcion;
   agenda=(struct directorio *)malloc(50*sizeof(struct directorio));
   folio=cuenta_registros();
   cargar(agenda);
   while(opcion!=5)                    
   {
      
      system("cls");
      printf("\t\t***** MENU *****\n\n");
      printf("\t1.- Ingresar registro");
      printf("\n\t2.- Borrar registro");
      printf("\n\t3.- Consultar registro");
      printf("\n\t4.- Visualizar Agenda");
      printf("\n\t5.- Salir\n");
      printf("\n\n\tSeleccione una opcion: ");
      scanf("%i",&opcion);

      switch(opcion){
      case 1: altas(agenda);break;  
      case 2: bajas(agenda);break;    
      case 3: consulta(agenda);break;
      case 4: visualiza(agenda);break;
      case 5: salir(agenda);free(agenda); exit(0); break;
      default: printf("\n\tOpcion no valida...");
       printf("\n\t<Presione una tecla para continuar>");getch();break;
      }
   }
}

void main()
{
   menu();
   
}

Electroduende

  • Miembro activo
  • **
  • Mensajes: 30
    • Ver Perfil
Re: Archivos En C
« Respuesta #4 en: Jueves 22 de Julio de 2004, 10:56 »
0
:hola:
aqui te pego un ejemplo sencillo:

#include <stdio.h>
#include <string.h>

struct registro
{
   int id;
   int dato_a;
   int dato_b;
   char dato_c;
   char str[64];
};

int
main()
{
   int i;
   FILE *file = fopen("datos.txt", "w+b");
   struct registro reg;
   reg.dato_a = 50;
   reg.dato_b = 100;
   reg.dato_c = 'A';
   reg.id = 1;
   for(i = 0; i < 10; ++i)
   {
      sprintf(reg.str, "Este registro hace el numero %d", reg.id);
      fwrite(®, sizeof(struct registro), 1, file);
      reg.dato_a += reg.dato_b;
      reg.dato_b += reg.id;
      ++reg.dato_c;
      ++reg.id;
   }
   fseek(file, 0, SEEK_SET);
   memset(®, 0, sizeof(reg));
   for(i = 0; i < 10; ++i)
   {
      fread(®, sizeof(struct registro), 1, file);
   }
   fclose(file);
   return 0;
}

Espero que te ayude en algo :D
Hasta luego,  :hola:
Electroduende
 :alien: