All pastes #801232 Raw Edit

codigo

public text v1 · immutable
#801232 ·published 2007-11-29 03:01 UTC
rendered paste body
#include "stdafx.h"
#include "stdlib.h"
#include <iostream>
#include "stdio.h"
#include <conio.h>
#include <string.h>
struct stRegistro {
   char valido;  // Campo que indica si el registro es válido S->Válido, N->Inválido
   char nombre[34];
   char rut[12];
   int nota[4];
};

int Menu();
void Leer(struct stRegistro *reg);
void Listar(long n, struct stRegistro *reg);
long LeeNumero();
void Empaquetar(FILE **fa);


int main()
{
   struct stRegistro reg;
   FILE *fa;
   int opcion;
   long numero;
   fa = fopen("notas.dat", "r+b");          // Este modo permite leer y escribir
   if(!fa) fa = fopen("notas.dat", "w+b");  // si el fichero no existe, lo crea.
   do {
      opcion = Menu();
      switch(opcion) 
	  {
         case '1': // Mostrar todo // Añadir registro
	        Leer(&reg);
            // Insertar al final:
            fseek(fa, 0, SEEK_END);
			fwrite(&reg, sizeof(struct stRegistro), 1, fa);
            system("PAUSE");
            break;
         case '2': // Mostrar todo
            rewind(fa);
            numero = 0;
            system("cls");
            printf("		*** INFORME FINAL DE CALIFICACIONES ***\n\n");
            printf("Reg.  Rut         Nombre                        Notas      Promedio\n");
            printf("-------------------------------------------------------------------\n");
            while(fread(&reg, sizeof(struct stRegistro), 1, fa))
               Listar(numero++, &reg);
            system("PAUSE");
            break;
         case '3': // Eliminar registro
            system("cls");
            printf("Eliminar registro: ");
            numero = LeeNumero();
            fseek(fa, numero*sizeof(struct stRegistro), SEEK_SET);
            fread(&reg, sizeof(struct stRegistro), 1, fa);
            reg.valido = 'N';
            fseek(fa, numero*sizeof(struct stRegistro), SEEK_SET);
            fwrite(&reg, sizeof(struct stRegistro), 1, fa);
            break;
         case '4': // Eliminar marcados
            Empaquetar(&fa);
            break;
	  }
   } while(opcion != '0');
   fclose(fa);
   return 0;
}


// Muestra un menú con las opciones disponibles y captura una opción del usuario
int Menu()
{
   char resp[20];
   do {
      system("cls");
	printf("    ***MENU***\n\n");
	printf("1.- CREAR ARCHIVO\n");
    printf("2.- LISTAR DATOS\n");
      printf("3- Eliminar registro\n");
      printf("4- Eliminar registros marcados\n");
	printf("0.- SALIR\n\n");
	printf("SELECCIONE OPCION: ");
      fgets(resp, 20, stdin);
   } while(resp[0] < '0' && resp[0] > '4');
   return resp[0];
}


// Permite que el usuario introduzca un registro por pantalla
void Leer(struct stRegistro *reg)
{
   int i;
   char numero[6];
   system("cls");
   printf("Leer registro:\n\n");
   reg->valido = 'S';
   printf("Rut: ");
   fgets(reg->rut, 12, stdin);
   // la función fgets captura el retorno de línea, hay que eliminarlo:
   for(i = strlen(reg->rut)-1; i && reg->rut[i] < ' '; i--)
      reg->rut[i] = 0;
   printf("Nombre: ");
   fgets(reg->nombre, 34, stdin);
   // la función fgets captura el retorno de línea, hay que eliminarlo:
   for(i = strlen(reg->nombre)-1; i && reg->nombre[i] < ' '; i--)
      reg->nombre[i] = 0;
   for(i = 1; i < 4; i++) {
      printf("Nota[%1d]: ", i);
      fgets(numero, 6, stdin);
      reg->nota[i] = atoi(numero);
   }
}

// Muestra un registro por pantalla en forma de listado,
// si no está marcado como borrado
void Listar(long n, struct stRegistro *reg)
{
   int i;
   if(reg->valido == 'S') {
      printf("[%ld]   %-10s", n, reg->rut);
      printf("  %-25s",reg->nombre);
      for(i = 1; i < 4; i++) printf("%4d", reg->nota[i]);
   }
   printf("      \n");

}


// Lee un número suministrado por el usuario
long LeeNumero()
{
   char numero[6];
   fgets(numero, 6, stdin);
   return atoi(numero);
}
 

// Elimina los registros marcados como borrados
void Empaquetar(FILE **fa)
{
   FILE *ftemp;
   struct stRegistro reg;

   ftemp = fopen("notas.tmp", "wb");
   rewind(*fa);
   while(fread(&reg, sizeof(struct stRegistro), 1, *fa))
      if(reg.valido == 'S')
         fwrite(&reg, sizeof(struct stRegistro), 1, ftemp);
   fclose(ftemp);
   fclose(*fa);
   remove("notas.bak");
   rename("notas.dat", "notas.bak");
   rename("notas.tmp", "notas.dat");
   *fa = fopen("notas.dat", "r+b");
}