Ayuda con Manejo de archivos!

Iniciado por pedro0620, 9 Septiembre 2016, 02:29 AM

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

pedro0620

Estoy haciendo un menu donde tenga las opciones de crear,mostrar,busrcar,eliminar y modificar archivo...

Ya tengo casi todo solo me hace falta el de eliminar y modificar.
Pero ahorita tengo bastantes problemas con el de modificar ya que al momento de pedrile que ingrese el numero de registro para modificaar no entra al ciclo... Quizas por el tiempo que eh estado en esto no veo el error. alguien que me pueda ayudar con esto o que me explique otro metodo para modificar.

este es mi codigo:

#include <Iostream>
#include<ctype.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;

FILE *empleados;
int n=1; /*Número del empleado*/
int i=0,band=0,fin=0,e=0,o=0;
int respu=0;
int r1=0, r2=0, r3=0, r4=0;

struct sRegistro
{
    char nombre[80];
    char apellido[80];
    char telefono[80];
    char direccion[80];
    char correo[80];
    char resp[5];
    char Cedula[11];
    char k, nom[80];
    double salario;
    int Eliminado;
} registro;


void Menu()
{
   printf("\t\t Menu Registros  \n");
   printf("\n1.- Crear Registro");
   printf("\n2.- Ingresar datos");
   printf("\n3.- Modificar Registro");
   printf("\n4.- Eliminar Registro");
   printf("\n5.- Mostrar Registros");
   printf("\n6.- Buscar Registro");
   printf("\n7.- Salir \n");
}

void creararchivo()
{
       empleados=fopen("empleados.txt", "r");

   if(!empleados)
   {
      empleados=fopen("empleados.txt", "w");
      printf("\nArchivo creado!");
   }
   else
   {
      printf("\nEl Archivo ya existe!");
   }

   fclose (empleados);

   return;
}

void insertararchivo()
{
   
   empleados=fopen("empleados.txt","a+");

   if(empleados == NULL)
   {
      printf("El archivo no existe! \nPor favor debe crearlo");
      return;
   } 
         
             printf("Introduzca el numero del empleado: ");
            scanf("%s",&registro.Cedula);     
             do
            {
               //system ("cls");                   
               fflush(stdin);
               printf("Introduzca el Nombre: ");
               scanf("%s", &registro.nombre);
               //while (nom[fin]!='\0')fin++;
               fin=strlen(registro.nombre);
               band=0;
               for(i=0;i<fin;i++)
               {
                  if(((registro.nombre>='A')&&(registro.nombre<='Z'))||((registro.nombre>='a')&&(registro.nombre<='z'))||(registro.nombre==' '))
                  {
                     band=0;
                  }
                  else //if(((nom>='A')&&(nom<='Z'))||((nom>='a')&&(nom[i<='z'])))
                  {
                     i=fin;
                     band=1;
                     printf("Caracteres invalidos... Intentelo de nuevo... \n");
                     system("pause>null");
                  }
               }
            }while(band==1);
            fflush(stdin);
            do
            {
               //system ("cls");
               fflush(stdin);
               printf("Introduzca el Apellido: ");
               scanf("%s",&registro.apellido);
               fin=strlen(registro.apellido);
               band=0;
               for(i=0;i<fin;i++)
               {
                  if(((registro.apellido>='A')&&(registro.apellido<='Z'))||((registro.apellido>='a')&&(registro.apellido<='z'))||(registro.apellido==' '))
                  {
                        band=0;
                  }
                  else
                  {
                     i=fin;
                     band=1;
                     printf("Caracteres invalidos... Intentelo de nuevo... \n");
                     system("pause>null");
                  }
               }
            }while(band==1);
            fflush(stdin);
            do
            {
               do
               {
                  //system ("cls");
                  fflush(stdin);
                  printf("Introduzca el Telefono: ");
                  scanf("%s",&registro.telefono);
                  fin=strlen(registro.telefono);
                  if(fin!=10)
                  {
                     printf("Ingrese un telefono de 10 digitos\n");
                     system("pause>null");
                  }
               }while(fin!=10);
                  band=0;
               for(i=0;i<fin;i++)
               {
                  if(((registro.telefono>='0')&&(registro.telefono<='9')))
                  {
                     band=0;
                  }
                  else
                  {
                     i=fin;
                     band=1;
                     printf("Caracteres invalidos... Intentelo de nuevo... \n");
                     system("PAUSE");
                  }
               }
            }while(band==1);
            fflush(stdin);
            do
            {
               //system ("cls");
               fflush(stdin);
               printf("Introduzca la Direccion: ");
               scanf("%s",&registro.direccion);
               //scanf("%s",direc);
               fin=strlen(registro.direccion);
               band=0;
               e=0;
               for(i=0;i<fin;i++)
               {
                  if(registro.direccion=='#')
                  {
                     e++;
                  }
                  if(((registro.direccion>='A')&&(registro.direccion<='Z')) || ((registro.direccion>='a')&&(registro.direccion<='z')) ||
                  ((registro.direccion>='0')&&(registro.direccion<='9')) || ((registro.direccion=='#')||(registro.direccion==':') ||
                  (registro.direccion==' ') || (registro.direccion=='.') || (registro.direccion=='-')))
                  {
                     band=0;
                  }
                  else
                  {
                     i=fin;
                     band=1;
                     printf("Solo se aceptan letras, numeros y los simbolos # y :\n");
                     system("pause>null");
                  }
                  if(e==2)
                  {
                     printf("Solo puede utilizar solo una vez el simbolo # \n");
                     i=fin;
                     band=1;
                     system("pause>null");
                  }
               }
            }while(band==1);
            fflush(stdin);
            do
            {
               //system ("cls");
               fflush(stdin);
               printf("Introduzca su correo electronico: ");
               scanf("%s",&registro.correo);
               fin=strlen(registro.correo);
               band=0;
               e=0;
               o=0;
               for(i=0;i<fin;i++)
               {
                  if(((registro.correo>='A')&&(registro.correo<='Z'))||
                  ((registro.correo>='a')&&(registro.correo<='z'))||
                  ((registro.correo>='0')&&(registro.correo<='9'))||
                  ((registro.correo=='#')||(registro.correo==':')||(registro.correo=='_')||(registro.correo=='-')||(registro.correo=='@')||(registro.correo=='.')))
                  {
                     if(registro.correo=='@')
                     {
                        o++;
                     }
                     if(registro.correo=='.')
                     {
                        e++;
                     }
                     band=0;
                  }
                  else
                  {
                     i=fin;
                     band=1;
                     printf("Solo se aceptan letras, numeros y los simbolos # : _ - y @ \n\n");
                     system("pause>null");
                  }
                  if(i==fin-1)
                  {
                     if(o!=1)
                     {
                        printf("Caracter invalido... Porfavor intentelo de nuevo... @\n\n");
                        i=fin;
                        band=1;
                        system("pause>null");
                     }
                  }
                  if(e>1)
                  {
                     printf("Caracter invalido... Porfavor intentelo de nuevo... \n");
                     i=fin;
                     band=1;
                     system("pause>null");
                  }
                  else if(registro.correo[fin-1]!='m')
                  {
                     printf("Caracter invalido... Porfavor intentelo de nuevo... \n");
                     i=fin;
                     band=1;
                     system("pause>null");
                  }
                  else if(registro.correo[fin-2]!='o')
                  {
                     printf("Caracter invalido... Porfavor intentelo de nuevo... \n");
                     i=fin;
                     band=1;
                     system("pause>null");
                  }
                  else if(registro.correo[fin-3]!='c')
                  {
                     printf("Caracter invalido... Porfavor intentelo de nuevo... \n");
                     i=fin;
                     band=1;
                     system("pause>null");
                  }
                  else if(registro.correo[fin-4]!='.')
                  {
                     printf("Caracter invalido... Porfavor intentelo de nuevo... \n");
                     i=fin;
                     band=1;
                     system("pause>null");
                  }
                  
               }
            }while(band==1);
            printf("\n");
            fprintf(empleados,"%s %s %s %s %s %s\n",registro.Cedula,registro.nombre,registro.apellido,registro.telefono,registro.direccion,registro.correo);
                  
     fclose(empleados);             
   
}

void Buscar()
{
   int num, f;
   char texto[2000];
   char k;
   printf("Numero de registro que desea buscar: ");
   scanf("%d",&num);
   num=num-1;
   empleados=fopen("empleados.txt","r");
   if(empleados!=NULL)
   {
      fgets(texto,2000,empleados);
      while(!feof(empleados))
      {
         if(f==num)
         {
            fprintf(empleados,"%d %s %s %s %s %s\n",n,registro.nombre,registro.apellido,registro.telefono,registro.direccion,registro.correo);
            puts(texto);
         }
         fgets(texto,2000,empleados);
         f++;         
      }
      
      
      fclose(empleados);
   }
   else
   {
      printf("Error en la apertura");
   }
}

void Modificar()
{
   char Cedula[11];
   unsigned int Tam;
   empleados=fopen("empleados.txt","rb+");
   
   if(empleados==NULL)
   {
      printf("Error en la apertura");
      return;
   }
   
   printf("Ingrese el numero de empleado a Modificar: ");
   scanf("%s",Cedula);
   
   if((empleados=fopen("empleados.txt","ab"))!=NULL)
   {
     fseek(empleados,0,2);
      Tam=ftell(empleados)/sizeof(registro);
      fclose(empleados);
   }
   
   if((empleados=fopen("empleados.txt", "rb+"))!=NULL)
   {
      for(int h=0; h<Tam ; h++)
      {//Inicia for
         fread(&registro, sizeof(struct sRegistro), 1, empleados);
            if(strcmp(Cedula,registro.Cedula)==0 and registro.Eliminado==0){
            printf("Desea cambiar la direccion? [ Si = 1 / No = 2 ]");
            scanf("%d",r1);
            fflush(stdin);
            while(r1==1)
            {
               printf("Ingrese nueva Direccion: ");
               scanf("%s", &registro.direccion);
               fflush(stdin);
               break;
            }
            
            printf("Desea cambiar el telefono? [ Si = 1 / No = 2 ]");
            scanf("%d",r2);
            fflush(stdin);
            while(r2==1)
            {
               printf("Ingrese nuevo telefono: ");
               scanf("%s",&registro.telefono);
               fflush(stdin);
               break;
            }
            
            printf("Desea cambiar el Email? [ Si = 1 / No = 2 ]");
            scanf("%d",r3);
            fflush(stdin);
            while(r3==1)
            {
               printf("Ingrese nuevo Email: ");
               scanf("%s",&registro.correo);
               fflush(stdin);
               break;
            }
            
       registro.Eliminado=0; // Aqui dejo constancia que el registro no esta eliminado        
         fseek(empleados,sizeof(registro)*h,SEEK_SET);
        fwrite(&registro, sizeof(struct sRegistro), 1, empleados);
   
        fclose(empleados);
        return;    

         }
      } //Cierra for
   }
   
   printf("El numero de empleado no existe...");         
    return;
   
}

void Mostrar()
{
   empleados=fopen("empleados.txt","r");
   char c;
   cout<<"\t\t Registros Ingresados: "<<endl;
   while(!feof(empleados))
   {
      c=fgetc(empleados);
      putchar(c);
   }
   fclose(empleados);
   
}


int main()
{
   int exit=0;
   int opcion;
   FILE *empleados;
   
   while(!exit)
   {//Inicia while
      
       Menu();
       printf("Opcion: ");
       scanf("%d",&opcion);
      
       switch(opcion)
       {
          case 1: creararchivo();
          system("pause>nuell");
          system("cls");
          break;
          
          case 2: insertararchivo();
          system("pause>null");
          system("cls");
          break;
          
          case 3:Modificar();
          system("pause>null");
          system("cls");
          break;
          
          case 4:
          break;
          
          case 5: Mostrar();
          system("pause>null");
          system("cls");
          break;
          
          case 6: Buscar();
          system("pause>null");
          system("cls");
          break;
          
          case 7:
             exit=1;
          break;
       }

      
   }//Termina while
   
}

AlbertoBSD

No entra al for de la funcion modificar??

Mira he detectado que abres arbitrariamente el archivo.
Lo abres cuando declaras la variable

empleados=fopen("empleados.txt","rb+");

No hay fclose para el primer fopen ademas vuelves a abrir en

if((empleados=fopen("empleados.txt", "rb+"))!=NULL)

Eso puede dar problemas, por que si ya esta abierto por tu programa te puede dar error de lectura al momento de calular el tamaño de tu archivo. (Cantida de registros) y tal vez por eso no entre al for.

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW