Na této stránce se používá SVG a MathML.
Firefox je umí a některé další prohlížeče se pro ně dají upravit.

Soubory (files)  ‑  pokračování


Budeme upravovat program Kartoteka z poslední ( 6.) přednášky.




Do datové struktury ‑ struct ‑  přidejte položku „platnost” nebo „určeno ke zrušení”. Smysl je takový, že rušit v souboru právě jednu položku (přepisovat celý soubor) je „drahé”. Je efektivnější mít onu položku pojmenovanou třeba platnost. Vždy ji při zřízení nastavit na „platná” a při jejím rušení na „neplatná”. Všechny dosavadní operace potom budou probíhat jen s těmi datovými strukturami, které jsou platné.
Jakožto další program ‑ volbu potom budete mít „vyčištění”, kdy se zobrazí ony „zneplatněné” a po jejich potvrzení ke zružení se teprve vymažou ‑ jen ty platné se přepíší do aktuální verse onoho datového souboru.
Napište také program či zaveďte volbu mít možnost „odzrušit” ‑ konkrétní ke zrušení určené „osobě” se znovu nastaví platnost.

Další změnou je, že budete záznamy (recordy ‑ C-vé datové struktury) ze datového (binárního) souboru načítat do jejich pole velikosti 16, hledat v něm a zapisovat z něj do datového (binárního) souboru.




/**
 * Program, ktery realizuje jednoduchou evidenci osob.
 * Informace o jednotlivych osobach jsou ukladany do
 * binarniho souboru.
 *
 * Poznamka: Prijmeni je povazovano za jednoznacny klic.
 *
 * @author   Jaroslav  Pelikan
 * @projectname   kartoteka.c
 * @file  main.c
 */

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

#define FILENAME "data.dat"

typedef struct osoba
{
    char jmeno[10], prijmeni[15];
    unsigned short vek;
} typOsoba;

void menu(void)
{
    puts("      K A R T O T E K A");
    puts("------------------------------");
    puts("1. Pridej osobu");
    puts("2. Vypis vsechny osoby");
    puts("3. Vymaz osobu");
    puts("4. Import z textoveho souboru");
    puts("5. Export do textoveho souboru");
    puts("6. Zaloz novou kartoteku");
    puts("7. Konec");
    puts("------------------------------");
    printf("Zvol operaci: ");
}

void pridej(FILE *f)
{
    typOsoba clovek;

    fseek(f,0,SEEK_END);
    printf("\nZadej jmeno   : ");
    scanf("%9s",clovek.jmeno);
    printf("Zadej prijmeni: ");
    scanf("%14s",clovek.prijmeni);
    printf("Zadej vek     : ");
    scanf("%hu",&clovek.vek);
    fwrite(&clovek,sizeof(typOsoba),1,f);
    printf("\n");
}

void vypis(FILE *f)
{
    typOsoba clovek;
    unsigned int i;

    puts("\nC. Jmeno      Prijmeni       Vek");
    puts("--------------------------------");
    i=0;
    rewind(f);
    while (fread(&clovek,sizeof(typOsoba),1,f)==1)
    {
      i++;
      printf("%2u %-10s %-15s%3hu\n",
             i,clovek.jmeno,clovek.prijmeni,clovek.vek);
    }
    printf("\n");
}

void vymaz(FILE *f)
{
    typOsoba clovek;
    FILE *tmp;
    char prijmeni[15];

    printf("\nZadej prijmeni: ");
    scanf("%14s",prijmeni);

    tmp=fopen("data.tmp","wb");
    rewind(f);
    while (fread(&clovek,sizeof(typOsoba),1,f)==1)
      if (strcmp(clovek.prijmeni,prijmeni))
         fwrite(&clovek,sizeof(typOsoba),1,tmp);
    fclose(tmp);
    fclose(f);

    remove(FILENAME);
    rename("data.tmp",FILENAME);
    f=fopen(FILENAME,"a+b");

    printf("\n");
}

void importuj(FILE *f)
{
    typOsoba clovek;
    FILE *txt;
    char jmeno[100],radek[30];
    char *pos1,*pos2;

    printf("Zadej jmeno souboru pro import: ");
    scanf("%99s",jmeno);

    txt=fopen(jmeno,"r");
    fseek(f,0,SEEK_END);
    while (fscanf(txt,"%29s",radek)==1)
    {
        pos1=strchr(radek,',');
        pos2=strrchr(radek,',');
        strncpy(clovek.jmeno,radek,pos1-radek);
        clovek.jmeno[pos1-radek]='\0';
        strncpy(clovek.prijmeni,pos1+1,pos2-pos1-1);
        clovek.prijmeni[pos2-pos1-1]='\0';
        clovek.vek=(unsigned short)strtoul(pos2+1,NULL,0);
        fwrite(&clovek,sizeof(typOsoba),1,f);
    }
    fclose(txt);

    printf("\n");
}

void exportuj(FILE *f)
{
    typOsoba clovek;
    FILE *txt;
    char jmeno[100];

    printf("\nZadej jmeno souboru pro export: ");
    scanf("%99s",jmeno);

    txt=fopen(jmeno,"w");
    rewind(f);
    while (fread(&clovek,sizeof(typOsoba),1,f)==1)
      fprintf(txt,"%s,%s,%hu\n",clovek.jmeno,clovek.prijmeni,clovek.vek);
    fclose(txt);

    printf("\n");
}

void nova(FILE *f)
{
    fclose(f);
    remove(FILENAME);
    f=fopen(FILENAME,"a+b");
    printf("\n");
}

int main(void)
{
    FILE *soubor;
    int c;

    soubor=fopen(FILENAME,"a+b");

    do
    {
      menu();
      c=getchar();
      switch (c)
      {
        case '1': pridej(soubor);
                  break;
        case '2': vypis(soubor);
                  break;
        case '3': vymaz(soubor);
                  break;
        case '4': importuj(soubor);
                  break;
        case '5': exportuj(soubor);
                  break;
        case '6': nova(soubor);
                  break;
      }
      while (getchar()!='\n');
    }
    while (c!='7');

    fclose(soubor);

    return 0;
}




K disposici máte (textový soubor):

Pavel  Novak     30
Michal Blazek   45
Marek Blaha      30
Martin  Vesely 40
Otto   Ruzicka    45
Lorem  Ipsum  33 
Dolor  Sit  44
Amet Consectetur        78 
Adipiscing Elit    12
Quisque Nisl    37
Eros Pulvinar    56
Facilisis Justo 65
Mollis Auctor    23
Consequat Urna   17
Morbi  Bibendum  23
Metus Donec 43
Scelerisque Sollicitudin 39
Enim     Eu  73
Venenatis  Duis  39
Tincidunt Laoret   48
Exin     Pretium  37
Orci Vestibulum    63
Eget      Class  81
Aptent Taciti    22
Sociosqu Ad     35
Litora Torquent   29
Per     Conubia 73
Nostra   Per   69
Inceptos Himenaeos  24
Duis     Pharetra    31
Luctus Lacus     19
Ut Questibulum  38
Maecenas Ripsum 58
Lacus Lacinia     63
Quis Posuere   83
Ut Poluvinar     13
Vitae Dolor  85
Integer    Beu 41
Nibi     At 28
Nisi Ullamcorper 39
Sagittis Id 71
Vel     Leo   81   
Integer Feugiat  53
Faucibus  Libero   41
At Maximus  61
Nisi Suscipit  70
Posuere Morbi  80
Nec Enim   51
Nunc Phasellus  57
Bibendum  Turpis  77
Ut     Gipsum  66
Egestas   Sed  88
Sollicitudin Quelit 55
Convallis Cras  67
Pharetra  Mi  66
Tristique  Sapien 55 
Vestibulum  Lobortis  31
Nam     Eget  50   
Bibendum  Quetus  47
Non  Dictum     60
Mauris  Nulla   33
At     Tellus  70
Sagittis Viverra 60
Est     Atahi   53
Bibendum Metus  18