|
Budeme upravovat program Kartoteka
z poslední ( 6.) přednášky.
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é.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