viernes, 2 de septiembre de 2011

Estanteria en C




Ejemplo de programa para la gestión de libros en una biblioteca personal realizado en lenguaje C

Se utilizan bucles (for, while, switch), estructuras de decisión (if, if else), acceso a ficheros de texto y binarios, ordenación de ficheros por el método de selección directa.

Enlace CodePad
http://codepad.org/vTyuZDQ1

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Código Fuente
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



#include <stdio.h>
#include <stdlib.h>

void crear_ficheros (void);
void introducir_libro_nuevo (void);
void listar_todo (void);
void prestar_libro (void);
void devolver_libro (void);
void marcar_libro_como_borrado (void);
void marcar_libro_como_no_borrado (void);
void listar_no_borrados (void);
void listar_no_borrados_a_fichero (void);
void listar_no_borrados_si_prestados (void);
void listar_no_borrados_si_prestados_fichero (void);
void listar_amigos_pantalla (void);
void listar_amigos_fichero (void);
void copiar_fichero_dos (void);
void copiar_fichero_fread_fwrite (void);
void listar_ordenado_titulo (void);
void ordenar_fichero_seleccion_directa (void);
void listar_ordenado_titulo_fichero (void);
void compactar_fichero (void);


struct Tficha
{
int signatura; //autonumerica
char titulo [50];
char autor [50];
char editorial [20];
int n_paginas;
float precio;
int prestado; // 0 no prestado - 1 prestado
char amigo [20];
char fecha_prestamo [11];
int borrado; // 0 no borrado - 1 borrado
char isbn [20];
char genero [20];
char idioma [10];
};

int main()
{
    int opcion_menu = 0, salir = 0;

    //me aseguro de que los ficheros existen y sino los creo
    crear_ficheros ();

    while (salir == 0) //salimos si salir es uno
    {
    system ("cls");

    printf("Aplicacion estanteria.\n");
    printf(" 1 - Introducir nuevos libros.\n");
    printf(" 2 - Prestar libros.\n");
    printf(" 3 - Devolver libros.\n");
    printf(" 4 - Eliminar libros.\n");
    printf(" - - - - - - - - - - - - - -\n");
    printf(" 5 - Listar libros en pantalla ordenados por signatura (titulo y autor).\n");
    printf(" 6 - Listar libros en fichero ordenados por signatura (titulo y autor).\n");
    printf(" 7 - Listar libros en pantalla ordenados por titulo (titulo y autor).\n");
    printf(" 8 - Listar libros en fichero ordenados por titulo (titulo y autor).\n");
    printf(" 9 - Listar libros prestados en pantalla (amigo y fecha préstamo).\n");
    printf("10 - Listar libros prestados en fichero (amigo y fecha préstamo).\n");
    printf("11 - Listar amigos que tienen algo prestado en pantalla.\n");
    printf("12 - Listar amigos que tienen algo prestado en texto.\n");
    printf(" 0 - Salir.\n");

    printf("\nSeleccione una opcion: ");
    scanf ("%d",&opcion_menu);
    fflush(stdin);

    switch (opcion_menu)
        {
            case 0:
                printf("Has elegido salir.");
                salir = 1;
                break;
            case 1:
                introducir_libro_nuevo ();
                break;
            case 2:
                prestar_libro ();
                break;
            case 3:
                devolver_libro ();
                break;
            case 4:
                marcar_libro_como_borrado ();
                break;
            case 5:
                listar_no_borrados ();
                break;
            case 6:
                listar_no_borrados_a_fichero ();
                break;
            case 7:
                //copiar_fichero_dos ();
                copiar_fichero_fread_fwrite ();
                ordenar_fichero_seleccion_directa ();
                listar_ordenado_titulo ();
                break;
            case 8:
                copiar_fichero_fread_fwrite ();
                ordenar_fichero_seleccion_directa ();
                listar_ordenado_titulo_fichero ();
                break;
            case 9:
                listar_no_borrados_si_prestados ();
                break;
            case 10:
                listar_no_borrados_si_prestados_fichero ();
                break;
            case 11:
                listar_amigos_pantalla ();
                break;
            case 12:
                listar_amigos_fichero ();
                break;
            case 98: //desmarcar libros borrados
                marcar_libro_como_no_borrado ();
                break;
            case 99: //listado de todo lo que hay en el fichero libros
                listar_todo ();
                break;
            case 100:
                compactar_fichero ();
                break;
            default:
                printf("La opcion seleccionada no esta disponible.");
                break;
        }
    }
    return 0;
}

void compactar_fichero (void)
{
    struct Tficha libro;
    FILE * fichero_libros;
    FILE * fichero_copia_libros;

    fichero_libros = fopen ("libros.vaf", "rb");
    fichero_copia_libros = fopen ("copia_libros_aux.vaf", "wb");

    system ("cls");
    printf("\n\nCopia listado\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0))
        {
            fwrite (&libro, sizeof(libro), 1, fichero_copia_libros);
        }
    }

    fclose (fichero_libros);
    fclose (fichero_copia_libros);

    remove("libros.vaf");

    if( rename("copia_libros_aux.vaf", "libros.vaf") == 0 )   printf( "El fichero ha sido renombrado: ");
    else   printf( "\nNo pudo ser renombrado\n" );

    getchar ();
}


void listar_ordenado_titulo_fichero (void)
{
    struct Tficha libro;
    FILE * fichero_libros;
    FILE * fichero_libros_ordenado_titulo;

    fichero_libros = fopen ("copia_libros.vaf", "rb");
    fichero_libros_ordenado_titulo = fopen ("listado_por_titulo.txt", "wt");

    system ("cls");

    printf("\n\nListado ordenado por titulo\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0))
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nTitulo: %s", libro.titulo);
            printf("\nAutor: %s", libro.autor);
            printf("\nEditorial: %s", libro.editorial);
            printf("\nIdioma: %s", libro.idioma);
            printf("\nGenero: %s", libro.genero);
            printf("\nNumero de paginas: %d", libro.n_paginas);
            printf("\nPrecio: %.2f", libro.precio);
            printf("\nPrestado: %d\n", libro.prestado);

            fprintf(fichero_libros_ordenado_titulo, "\nSignatura: %d", libro.signatura);
            fprintf(fichero_libros_ordenado_titulo, "\nTitulo: %s", libro.titulo);
            fprintf(fichero_libros_ordenado_titulo, "\nAutor: %s", libro.autor);
            fprintf(fichero_libros_ordenado_titulo, "\nEditorial: %s", libro.editorial);
            fprintf(fichero_libros_ordenado_titulo, "\nIdioma: %s", libro.idioma);
            fprintf(fichero_libros_ordenado_titulo, "\nGenero: %s", libro.genero);
            fprintf(fichero_libros_ordenado_titulo, "\nNumero de paginas: %d", libro.n_paginas);
            fprintf(fichero_libros_ordenado_titulo, "\nPrecio: %.2f", libro.precio);
            fprintf(fichero_libros_ordenado_titulo, "\nPrestado: %d\n", libro.prestado);



        }
    }
    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
    fclose (fichero_libros_ordenado_titulo);
}




void listar_ordenado_titulo (void)
{
    struct Tficha libro;
    FILE * fichero_libros;
    fichero_libros = fopen ("copia_libros.vaf", "rb");

    system ("cls");

    printf("\n\nListado ordenado por titulo\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0))
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nTitulo: %s", libro.titulo);
            printf("\nAutor: %s", libro.autor);
            printf("\nEditorial: %s", libro.editorial);
            printf("\nIdioma: %s", libro.idioma);
            printf("\nGenero: %s", libro.genero);
            printf("\nNumero de paginas: %d", libro.n_paginas);
            printf("\nPrecio: %.2f", libro.precio);
            printf("\nPrestado: %d\n", libro.prestado);
        }
    }
    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
}



void copiar_fichero_dos (void)
{
    system("copy /y libros.vaf copia_libros.vaf");
}

void copiar_fichero_fread_fwrite (void)
{
    struct Tficha libro;
    FILE * fichero_libros;
    FILE * fichero_copia_libros;

    fichero_libros = fopen ("libros.vaf", "rb");
    fichero_copia_libros = fopen ("copia_libros.vaf", "wb");

    system ("cls");
    printf("\n\nCopia listado\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0))
        {
            fwrite (&libro, sizeof(libro), 1, fichero_copia_libros);
        }
    }

    fclose (fichero_libros);
    fclose (fichero_copia_libros);
}

void listar_amigos_fichero (void)
{
    struct Tficha libro;
    FILE * fichero_libros;
    FILE * fichero_listado_amigos;

    fichero_libros = fopen ("libros.vaf", "rb");
    fichero_listado_amigos = fopen ("listado_amigos.txt", "wt");

    system ("cls");
    printf("\n\nListado amigos\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0) && (libro.prestado == 1))
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nAmigo: %s", libro.amigo);
            printf("\nFecha de prestamo: %s", libro.fecha_prestamo);

            fprintf(fichero_listado_amigos, "\nSignatura: %d", libro.signatura);
            fprintf(fichero_listado_amigos, "\nAmigo: %s", libro.amigo);
            fprintf(fichero_listado_amigos, "\nFecha de prestamo: %s", libro.fecha_prestamo);
        }
    }

    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
    fclose (fichero_listado_amigos);
}

void listar_amigos_pantalla (void)
{
    struct Tficha libro;
    FILE * fichero_libros;

    fichero_libros = fopen ("libros.vaf", "rb");

    system ("cls");
    printf("\n\nListado amigos\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0) && (libro.prestado == 1))
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nAmigo: %s", libro.amigo);
            printf("\nFecha de prestamo: %s", libro.fecha_prestamo);
        }
    }

    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
}

void listar_no_borrados_a_fichero (void)
{
    struct Tficha libro;
    FILE * fichero_libros;
    FILE * fichero_listado_signatura;

    fichero_libros = fopen ("libros.vaf", "rb");
    fichero_listado_signatura = fopen ("listado_signatura.txt", "wt");

    system ("cls");

    printf("\n\nListado completo\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0))
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nTitulo: %s", libro.titulo);
            printf("\nAutor: %s", libro.autor);
            printf("\nEditorial: %s", libro.editorial);
            printf("\nIdioma: %s", libro.idioma);
            printf("\nGenero: %s", libro.genero);
            printf("\nNumero de paginas: %d", libro.n_paginas);
            printf("\nPrecio: %.2f", libro.precio);
            printf("\nPrestado: %d\n", libro.prestado);

            fprintf(fichero_listado_signatura, "\nSignatura: %d", libro.signatura);
            fprintf(fichero_listado_signatura, "\nTitulo: %s", libro.titulo);
            fprintf(fichero_listado_signatura, "\nAutor: %s", libro.autor);
            fprintf(fichero_listado_signatura, "\nEditorial: %s", libro.editorial);
            fprintf(fichero_listado_signatura, "\nIdioma: %s", libro.idioma);
            fprintf(fichero_listado_signatura, "\nGenero: %s", libro.genero);
            fprintf(fichero_listado_signatura, "\nNumero de paginas: %d", libro.n_paginas);
            fprintf(fichero_listado_signatura, "\nPrecio: %.2f", libro.precio);
            fprintf(fichero_listado_signatura, "\nPrestado: %d\n", libro.prestado);
        }
    }

    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
    fclose (fichero_listado_signatura);
}

void listar_no_borrados_si_prestados_fichero (void)
{
    struct Tficha libro;
    FILE * fichero_libros;
    FILE * fichero_listado_prestados;

    fichero_libros = fopen ("libros.vaf", "rb");
    fichero_listado_prestados = fopen ("listado_prestados.txt", "wt");

    system ("cls");
    printf("\n\nListado prestados.\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0) && (libro.prestado == 1))
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nTitulo: %s", libro.titulo);
            printf("\nAutor: %s", libro.autor);
            printf("\nEditorial: %s", libro.editorial);
            printf("\nIdioma: %s", libro.idioma);
            printf("\nGenero: %s", libro.genero);
            printf("\nNumero de paginas: %d", libro.n_paginas);
            printf("\nPrecio: %.2f", libro.precio);
            printf("\nAmigo: %s", libro.amigo);
            printf("\nFecha de prestamo: %s", libro.fecha_prestamo);


            fprintf(fichero_listado_prestados, "\nSignatura: %d", libro.signatura);
            fprintf(fichero_listado_prestados, "\nTitulo: %s", libro.titulo);
            fprintf(fichero_listado_prestados, "\nAutor: %s", libro.autor);
            fprintf(fichero_listado_prestados, "\nEditorial: %s", libro.editorial);
            fprintf(fichero_listado_prestados, "\nIdioma: %s", libro.idioma);
            fprintf(fichero_listado_prestados, "\nGenero: %s", libro.genero);
            fprintf(fichero_listado_prestados, "\nNumero de paginas: %d", libro.n_paginas);
            fprintf(fichero_listado_prestados, "\nPrecio: %.2f", libro.precio);
            fprintf(fichero_listado_prestados, "\nAmigo: %s", libro.amigo);
            fprintf(fichero_listado_prestados, "\nFecha de prestamo: %s", libro.fecha_prestamo);

        }
    }

    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
    fclose (fichero_listado_prestados);
}



void listar_no_borrados_si_prestados (void)
{
    struct Tficha libro;
    FILE * fichero_libros;
    fichero_libros = fopen ("libros.vaf", "rb");

    system ("cls");
    printf("\n\nListado completo\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0) && (libro.prestado == 1))
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nTitulo: %s", libro.titulo);
            printf("\nAutor: %s", libro.autor);
            printf("\nEditorial: %s", libro.editorial);
            printf("\nIdioma: %s", libro.idioma);
            printf("\nGenero: %s", libro.genero);
            printf("\nNumero de paginas: %d", libro.n_paginas);
            printf("\nPrecio: %.2f", libro.precio);
            printf("\nAmigo: %s", libro.amigo);
            printf("\nFecha de prestamo: %s", libro.fecha_prestamo);
        }
    }

    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
}

void listar_no_borrados (void)
{
    struct Tficha libro;
    FILE * fichero_libros;

    fichero_libros = fopen ("libros.vaf", "rb");

    system ("cls");
    printf("\n\nListado completo\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((feof (fichero_libros)== 0) && (libro.borrado == 0))
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nTitulo: %s", libro.titulo);
            printf("\nAutor: %s", libro.autor);
            printf("\nEditorial: %s", libro.editorial);
            printf("\nIdioma: %s", libro.idioma);
            printf("\nGenero: %s", libro.genero);
            printf("\nNumero de paginas: %d", libro.n_paginas);
            printf("\nPrecio: %.2f", libro.precio);
            printf("\nPrestado: %d\n", libro.prestado);
        }
    }

    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
}




void marcar_libro_como_no_borrado (void)
{
    struct Tficha libro;
    int signatura_a_recuperar, recuperado = 0;

    FILE * fichero_libros;

    fichero_libros = fopen ("libros.vaf", "rb+");

    system ("cls");
    printf("\nBorrado de libros\n\n");

    printf("\nIndica la signatura del libro a recuperar: ");
    scanf("%d", &signatura_a_recuperar);
    fflush(stdin);

    libro.borrado = 0;

     while ((feof (fichero_libros)== 0) && (recuperado == 0))
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((libro.signatura == signatura_a_recuperar)&& (libro.borrado == 1))
        {
            libro.borrado = 0;

            //retrocedemos el cursor en el fichero para posicionarnos de nuevo
            //al principio de los datos del libro
            fseek (fichero_libros, -1 * sizeof (libro), SEEK_CUR);

            //reescribimos la estructura modificada
            fwrite (&libro, sizeof(libro), 1, fichero_libros);

            printf("Libro %d recuperado con exito", libro.signatura);

            recuperado = 1;
        }

    }

        if (recuperado == 0)
        {
            printf("El libro de signatura %d no ha sido localizado.", signatura_a_recuperar);
        }

    getchar();

    fclose(fichero_libros);
}


void marcar_libro_como_borrado (void)
{
    struct Tficha libro;
    int signatura_a_borrar, borrado = 0;

    FILE * fichero_libros;

    fichero_libros = fopen ("libros.vaf", "rb+");

    system ("cls");

    printf("\nBorrado de libros\n\n");

    printf("\nIndica la signatura del libro a borrar: ");
    scanf("%d", &signatura_a_borrar);
    fflush(stdin);

    libro.borrado = 0;

     while ((feof (fichero_libros)== 0) && (borrado == 0) )
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if ((libro.signatura == signatura_a_borrar)&& (libro.borrado == 0))
        {
            libro.borrado = 1;

            //retrocedemos el cursor en el fichero para posicionarnos de nuevo
            //al principio de los datos del libro
            fseek (fichero_libros, -1 * sizeof (libro), SEEK_CUR);

            //reescribimos la estructura modificada
            fwrite (&libro, sizeof(libro), 1, fichero_libros);

            printf("Libro %d borrado con exito", libro.signatura);

            borrado = 1;
        }

    }

        if (borrado == 0)
        {
            printf("El libro de signatura %d no ha sido localizado.", signatura_a_borrar);
        }

    getchar();

    fclose(fichero_libros);
}



void devolver_libro (void)
{
    struct Tficha libro;
    int signatura_a_devolver, devuelto = 0;

    FILE * fichero_libros;

    fichero_libros = fopen ("libros.vaf", "rb+");

    system ("cls");
    printf("\nDevolucion de libros\n\n");

    printf("\nIndica la signatura del libro a devolver: ");
    scanf("%d", &signatura_a_devolver);
    fflush(stdin);

     while ((feof (fichero_libros)== 0) && (devuelto == 0) && (libro.prestado == 1))
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if (libro.signatura == signatura_a_devolver)
        {
            libro.prestado = 0;

            //retrocedemos el cursor en el fichero para posicionarnos de nuevo
            //al principio de los datos del libro
            fseek (fichero_libros, -1 * sizeof (libro), SEEK_CUR);

            //reescribimos la estructura modificada
            fwrite (&libro, sizeof(libro), 1, fichero_libros);

            printf("Libro %d devuelto con exito.", libro.signatura);

            devuelto = 1;
        }

    }

        if (devuelto == 0)
        {
            printf("El libro de signatura %d no ha sido localizado, o no esta prestado.", signatura_a_devolver);
        }
    getchar();

    fclose(fichero_libros);
}





void prestar_libro (void)
{
    struct Tficha libro;
    int signatura_a_prestar, prestado = 0;

    FILE * fichero_libros;

    fichero_libros = fopen ("libros.vaf", "rb+");

    system ("cls");
    printf("\nPrestamo de libros\n\n");

    printf("\nIndica la signatura del libro a prestar: ");
    scanf("%d", &signatura_a_prestar);
    fflush(stdin);

     while ((feof (fichero_libros)== 0) && (prestado == 0))
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if (libro.signatura == signatura_a_prestar)
        {
            libro.prestado = 1;

            printf("\nAmigo: ");
            gets (libro.amigo);

            printf("Fecha prestamo: ");
            gets (libro.fecha_prestamo);

            //retrocedemos el cursor en el fichero para posicionarnos de nuevo
            //al principio de los datos del libro
            fseek (fichero_libros, -1 * sizeof (libro), SEEK_CUR);

            //reescribimos la estructura modificada
            fwrite (&libro, sizeof(libro), 1, fichero_libros);

            printf("Libro %d prestado con exito a %s", libro.signatura, libro.amigo);

            prestado = 1;
        }

    }

        if (prestado == 0)
        {
            printf("El libro de signatura %d no ha sido localizado.", signatura_a_prestar);
        }
    getchar();

    fclose(fichero_libros);
}



void listar_todo (void)
{
    struct Tficha libro;
    FILE * fichero_libros;

    fichero_libros = fopen ("libros.vaf", "rb");

    system ("cls");
    printf("\n\nListado completo\n\n");

    while (feof (fichero_libros)== 0)
    {
        fread (&libro, sizeof(libro), 1, fichero_libros);

        if (feof (fichero_libros)== 0)
        {
            printf("\nSignatura: %d", libro.signatura);
            printf("\nTitulo: %s", libro.titulo);
            printf("\nAutor: %s", libro.autor);
            printf("\nPrestado: %d", libro.prestado);
            printf("\nBorrado: %d\n", libro.borrado);

        }
    }

    printf("\n\nPulse una tecla para continuar....");
    getchar();

    fclose (fichero_libros);
}


void introducir_libro_nuevo (void)
{
    struct Tficha libro;

    FILE * fichero_libros;
    FILE * fichero_signatura;

    int siguiente_signatura;

    fichero_signatura = fopen ("signatura.vaf", "rb");
    rewind(fichero_signatura);
    //se lee el dato almacenado en signatura.vaf que corresponde a la ultima utilizada
    fread (&siguiente_signatura, sizeof(siguiente_signatura), 1, fichero_signatura);
    fclose(fichero_signatura);

    //se incrementa en uno la signatura leida para poder utilizarla en el siguiente libro
    siguiente_signatura++;

    printf("\nLa signatura correspondiente es %d.", siguiente_signatura);

    fichero_libros = fopen ("libros.vaf", "ab");


    libro.signatura = siguiente_signatura;

    printf("\nTitulo: ");
    gets (libro.titulo);

    printf("Autor ");
    gets (libro.autor);

    printf("Editorial: ");
    gets (libro.editorial);

    printf("Genero: ");
    gets (libro.genero);

    printf("Idioma: ");
    gets (libro.idioma);

    printf("ISBN: ");
    gets (libro.isbn);

    printf("Numero de paginas: ");
    scanf ("%d",&libro.n_paginas);
    fflush(stdin);

    printf("Precio: ");
    scanf ("%f",&libro.precio);
    fflush(stdin);

    libro.borrado = 0;
    libro.prestado = 0;

    fwrite (&libro, sizeof(libro), 1, fichero_libros);

    fclose (fichero_libros);

    fichero_signatura = fopen ("signatura.vaf", "wb");
    //se lee el dato almacenado en signatura.vaf que corresponde a la ultima utilizada
    fwrite (&siguiente_signatura, sizeof(siguiente_signatura), 1, fichero_signatura);
    fclose(fichero_signatura);

}

void crear_ficheros (void)
{
    FILE * fichero_libros;
    FILE * fichero_signatura;

    int signatura = 0;

    fichero_libros = fopen ("libros.vaf", "rb");
    fichero_signatura = fopen ("signatura.vaf", "rb");

    if (fichero_libros == NULL) // si devuelve NULL lo abrimos como wb para crearlo vacio
    {
        fichero_libros = fopen ("libros.vaf", "wb");
    }

    if (fichero_signatura == NULL)
    {
        fichero_signatura = fopen ("signatura.vaf", "wb");
        //incluimos un cero como valor de la ultima signatura
        fwrite (&signatura, sizeof(signatura), 1, fichero_signatura);
    }

    fclose(fichero_libros);
    fclose(fichero_signatura);
}


void ordenar_fichero_seleccion_directa (void)
{
    struct Tficha auxiliar, menor, actual;
    FILE * fichero;
   	int i, j,pos_menor, total_estructuras;

    //se abre el fichero como rb+ para poder sobreescribir los datos
    fichero = fopen("copia_libros.vaf", "rb+");

    //nos colocamos al final del fichero y con ftell y sizeof obtenemos el
    //numero total de estructuras almacenadas en el fichero
    fseek (fichero, 0, SEEK_END);
    total_estructuras = ftell (fichero) / sizeof (struct Tficha);

    printf("\nO numero de estructuras e: %d, comezando proceso de ordenacion\n", total_estructuras);

    //regresamos al principio del fichero
    //rewind(fichero);

	for (i=0; i<=(total_estructuras - 2); i++) //k es la posicion de la estructura que se esta a pegar
    {
	    pos_menor=i;

		fseek (fichero, i * sizeof (struct Tficha), SEEK_SET);

		//leemos en ficha aux la posicion a escribir
		fread (&menor, sizeof (struct Tficha), 1, fichero);

		auxiliar = menor;

		for (j=i+1; j<=(total_estructuras - 1); j++)
		{
            fseek (fichero, j * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fread (&actual, sizeof (struct Tficha), 1, fichero);

            if ( strcmpi(menor.titulo, actual.titulo) > 0)
            {
                pos_menor=j;
                menor=actual;
            }
		}

        if (pos_menor != i)
        {
            fseek (fichero, i * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fwrite (&menor, sizeof (struct Tficha), 1, fichero);
            //vector[i] = vector[k];

            fseek (fichero, pos_menor * sizeof (struct Tficha), SEEK_SET);

            //leemos en ficha aux la posicion a escribir
            fwrite (&auxiliar, sizeof (struct Tficha), 1, fichero);
        }
	}

    fclose(fichero);
}

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...