martes, 5 de mayo de 2015

Código para crear un archivo directo en C++

Hoy le enseñare un código para crear un archivo directo en C++ utilizando Visual Studio 2012 Primero Abren su Visual Studio -> Nuevo Proyecto-> Visual C++ -> Proyecto Vacio-> Le ponen el nombre y la ubicacion al proyecto y le ponen aceptar esperan a que se les habrá el proyecto-> Explorador de soluciones -> Clic derecho sobre el proyecto ->Agregar->Nuevo elemento Esperan a que se habra


Luego pegan este codigo , despues compilan precionando f6 esperan ->Despes de que diga compilacion correcta lo corren con ctrl + f5 o solo con f5
#include <stdio.h> // Para el manejo de archivos
#include <string.h> // Para el manejo de cadenas
#include <conio.h> // Para el manejo de clrscr
#include <iostream> // Para el manejo de cout
#include <ctype.h> // Para el uso de toupper
#include <Windows.h>
using namespace std;
struct tipo_registro
{                      // Campos:
  int no_prod;         // Numero de producto
  char descrip[65];    // Descripcion del articulo
  int cantidad;        // Cantidad disponible en almacen
  float precio;        // Precio del articulo
  char garantia;       // Tiene garantia? [S/N]
};

struct tipo_registro Registro; // Declaracion global de la variable
                                                      // "Registro" de tipo struct tipo_registro

FILE *alias;  // Declaracion global de la variable "alias" (apuntador a un
                      // archivo
long int dir_fisica;  // Declaracion global de la variable para calcular
                                     // la direccion fisica

void ALTA_DIRECTA(void); // Declaracion global de la rutina de Altas
void CONSULTA_DIRECTA(void); // Declaracion global de la rutina de Consultas
void MODIFICACION_DIRECTA(void); // Declaracion global de la rutina de Modificaciones
void BAJA_LOGICA_DIRECTA(void); // Declaracion global de la rutina de Baja Logica
void LISTADO_SECUENCIAL(void); // Declaracion global de la rutina de Listado

void main(void)
{
int op;
  do
  {
     system("cls");
     cout << "\n\n\r Programa que almacena datos de PRODUCTOS en un ARCHIVO DIRECTO";
     cout << "\n\n\r  Curso: \"Manejo de archivos en Lenguaje C++\"";
     cout << "\n\r  Instructor: Ing. Bruno Lopez Takeyas, M.C.";
     cout << "\n\n\n\r 1.- Altas directas";
     cout << "\n\r 2.- Consultas directas";
     cout << "\n\r 3.- Modificaciones directas";
     cout << "\n\r 4.- Bajas logicas directas";
     cout << "\n\r 5.- Listado Secuencial";
     cout << "\n\r 0.- Salir";

     cout << "\n\n\n\r Seleccione su opcion ---> ";
     cin >> op;

     switch(op)
     {
                case 1 : ALTA_DIRECTA();         break;
                case 2 : CONSULTA_DIRECTA();     break;
                case 3 : MODIFICACION_DIRECTA(); break;
                case 4 : BAJA_LOGICA_DIRECTA();  break;
                case 5 : LISTADO_SECUENCIAL();   break;
     }
  }while(op!=0);
  return;
}


void ALTA_DIRECTA(void)
{
  int no_prod;  // Variable local para el numero de producto
  system("cls");

  cout << "\n\rALTAS DE REGISTROS DE PRODUCTOS";
  alias=fopen("PRODUCTO.DIR","rb+"); // Intenta abrir el archivo PRODUCTO.DIR
                                                                    // en modo de lectura/escritura
  if(alias==NULL)
    alias=fopen("PRODUCTO.DIR","wb"); // Crea el archivo en caso de no existir


  cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;


  dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica
  fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo

  fread(&Registro,sizeof(Registro),1,alias);
     // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
  if(Registro.no_prod==no_prod)
  {
       cout << "\n\n\n\rRegistro duplicado !!!";
       fclose(alias);
       getch();
       return;
  }

  cout << "\n\rDescripcion: "; scanf("%s",&(Registro.descrip));
  cout << "\n\rCantidad   : "; cin >> Registro.cantidad;
  cout << "\n\rPrecio     : "; cin >> Registro.precio;
  do
  {
    cout << "\n\rGarantia   : "; Registro.garantia=toupper(getche());
  }while(Registro.garantia!='S' && Registro.garantia!='N');

  Registro.no_prod=no_prod;

  fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
  fwrite(&Registro,sizeof(Registro),1,alias); // Grabar el Registro completo
  fclose(alias); // Cierra el archivo

  cout << "\n\n\n\rProducto registrado !!!";
  cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
  getch();
  return;
}

void CONSULTA_DIRECTA(void)
{
  int no_prod; // Variable local para el numero de producto que desea consultar
  system("cls");

  cout << "\n\rCONSULTA DE REGISTROS DE PRODUCTOS";
  alias=fopen("PRODUCTO.DIR","rb"); // Intenta abrir el archivo PRODUCTO.DIR
                                                                    // en modo de solo lectura
  if(alias==NULL)
  {
    cout << "\n\n\n\rNo existe el archivo !!!";
    cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
    getch();
    return;
  }

  cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;

  dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica
  fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
  fread(&Registro,sizeof(Registro),1,alias);
     // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
  if(Registro.no_prod==no_prod)
  {
    cout << "\n\rNo Prod                    Descripcion  Cantidad        Precio  Garantia";
    cout << "\n\r------------------------------------------------------------------------";
    printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,Registro.cantidad,Registro.precio,Registro.garantia);
  }
  else
  {
    cout << "\n\n\n\rNo existe ese registro !!!";
  }
  fclose(alias);
  cout << "\n\n\n\n\r<<< Oprima cualquier tecla para continuar >>>";
  getch();
  return;
}

void MODIFICACION_DIRECTA(void)
{
  int no_prod; // Variable local para el numero de producto que desea modificar
  system("cls");

  cout << "\n\rMODIFICACION DE REGISTROS DE PRODUCTOS";
  alias=fopen("PRODUCTO.DIR","rb+"); // Intenta abrir el archivo PRODUCTO.DIR
                                                                    // en modo de lectura/escritura
  if(alias==NULL)  // Valida la existencia del archivo
  {
    cout << "\n\n\n\rNo existe el archivo !!!";
    cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
    getch();
    return;
  }

  cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;

  dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica
  fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
  fread(&Registro,sizeof(Registro),1,alias);
     // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
  if(Registro.no_prod==no_prod)
  {
      cout << "\n\rNo Prod                    Descripcion  Cantidad        Precio  Garantia";
      cout << "\n\r------------------------------------------------------------------------";
      printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,Registro.cantidad,Registro.precio,Registro.garantia);

      cout << "\n\n\n\rAnote los nuevos datos ...";
      cout << "\n\rDescripcion: "; scanf("%s",&(Registro.descrip));;
      cout << "\n\rCantidad   : "; scanf("%d",&(Registro.cantidad));;
      cout << "\n\rPrecio     : "; scanf("%f",&(Registro.precio));
      do
      {
                cout << "\n\rGarantia   : "; Registro.garantia=toupper(getche());
      }while(Registro.garantia!='S' && Registro.garantia!='N');

      // Es necesario reposicionar el apuntador del archivo al principio del
      // registro que desea modificar, ya que al leer un registro, el
      // apuntador se posiciona en el registro siguiente
      // La funcion ftell(alias) devuelve la posicion donde se encuentra el
      // apuntador
      fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
      fwrite(&Registro,sizeof(Registro),1,alias);  // Graba el registro con
                                                                                                 // los nuevos campos
      fclose(alias);   // Cierra el archivo
      cout << "\n\n\n\rRegistro modificado !!!";
      cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
      getch();
      return;
  }
  else
  {
   cout << "\n\n\n\rNo se encuentra ese registro !!!";
  }
  fclose(alias); // Cierra el archivo
  cout << "\n\n\n\n\r<<< Oprima cualquier tecla para continuar >>>";
  getch();
  return;
}

void BAJA_LOGICA_DIRECTA(void)
{
  int no_prod; // Variable local para el numero de producto que desea eliminar
  char op;
  system("cls");

  cout << "\n\rBAJA LOGICA DE REGISTROS DE PRODUCTOS";
  alias=fopen("PRODUCTO.DIR","rb+"); // Intenta abrir el archivo PRODUCTO.DIR
                                                                    // en modo de lectura/escritura
  if(alias==NULL)  // Valida la existencia del archivo
  {
    cout << "\n\n\n\rNo existe el archivo !!!";
    cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
    getch();
    return;
  }

  cout << "\n\n\n\rNumero de producto: "; cin >> no_prod;

  dir_fisica=no_prod*sizeof(Registro); // Calculo de la dir. fisica
  fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
  fread(&Registro,sizeof(Registro),1,alias);
     // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
  if(Registro.no_prod==no_prod)
  {
      cout << "\n\rNo Prod                    Descripcion  Cantidad        Precio  Garantia";
      cout << "\n\r------------------------------------------------------------------------";
      printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c\n\n\n\n\r",Registro.no_prod,Registro.descrip,Registro.cantidad,Registro.precio,Registro.garantia);

      Registro.no_prod=0;
      strcpy(Registro.descrip,"");
      Registro.cantidad=0;
      Registro.precio=0.0;
      Registro.garantia=' ';

      // Es necesario reposicionar el apuntador del archivo al principio del
      // registro que desea modificar, ya que al leer un registro, el
      // apuntador se posiciona en el registro siguiente
      // La funcion ftell(alias) devuelve la posicion donde se encuentra el
      // apuntador
      do
      {
                cout << "\n\rEsta seguro que desea eliminar este registro? [S/N] ---> ";
                op=toupper(getche());
      }while(op!='S' && op!='N');
      if(op=='S')
      {
                fseek(alias,dir_fisica,SEEK_SET); //Posicionar el apuntador del archivo
                fwrite(&Registro,sizeof(Registro),1,alias);  // Graba el registro con
                                                                                                 // los nuevos campos
                cout << "\n\n\n\rRegistro eliminado logicamente !!!";
      }
      else
      {
                    cout << "\n\n\n\rRegistro NO eliminado !!!";
      }
      fclose(alias);   // Cierra el archivo
      cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
      getch();
      return;
  }
  else
  {
   cout << "\n\n\n\rNo se encuentra ese registro !!!";
  }
  fclose(alias); // Cierra el archivo
  cout << "\n\n\n\n\r<<< Oprima cualquier tecla para continuar >>>";
  getch();
  return;
}

void LISTADO_SECUENCIAL(void)
{
  system("cls");

  cout << "\n\rLISTADO DE REGISTROS DE PRODUCTOS";
  alias=fopen("PRODUCTO.DIR","rb"); // Intenta abrir el archivo PRODUCTO.DIR
                                                                    // en modo de solo lectura
  if(alias==NULL)
  {
    cout << "\n\n\n\rNo existe el archivo !!!";
    cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
    getch();
    return;
  }

  cout << "\n\rNo Prod                    Descripcion  Cantidad        Precio  Garantia";
  cout << "\n\r------------------------------------------------------------------------";
  fread(&Registro,sizeof(Registro),1,alias);
     // Lee el "Registro", de tamano=sizeof(Registro) del archivo "alias"
  while(!feof(alias)) // Ciclo mientras no se encuentre el final del archivo
  {
    printf("\n\r%3d\t%30s\t%3d\t\t$%4.2f\t%c",Registro.no_prod,Registro.descrip,Registro.cantidad,Registro.precio,Registro.garantia);
    fread(&Registro,sizeof(Registro),1,alias);
  }
  fclose(alias); // Cierra el archivo
  cout << "\n\r------------------------------------------------------------------------";
  cout << "\n\rFin del listado !!!";
  cout << "\n\r<<< Oprima cualquier tecla para continuar >>>";
  getch();
  return;
}


No hay comentarios:

Publicar un comentario