Záloha databáze v souboru

Download Report

Transcript Záloha databáze v souboru

Počítače a programování 1 pro obor EST
BPC1E
PŘEDNÁŠKA 10
OSNOVA:
a) Programování se soubory
b) Záloha databáze v souboru
c) Příklady
Jiří Šebesta
Ústav radioelektroniky, FEKT VUT v Brně
Programování se soubory (1/7)
• Datový typ FILE
V knihovně stdio.h definován speciální typ FILE (psáno
velkým písmem), pomocí něhož se lze odkazovat na soubor
otevřený v operační paměti počítače. Součástí knihovny
stdio.h je skupina funkcí, umožňujících snadnou práci se
soubory:
• funkce FILE *fopen(jmeno_soub., atribut)
Funkce otevře soubor jmeno_soub., na kterém lze provádět
operace podle atributu atribut a vrátí ukazatel na otevřený
soubor typu FILE*.
Programování se soubory (2/7)
Atributy funkce fopen()- atribut je vždy řetězec:
otevře soubor pro čtení (musí existovat)
otevře nový prázdný soubor pro zápis (existuje-li soubor
se stejným názvem, smaže se jeho obsah)
"a" otevře existující soubor pro zápis (další obsah je přidán
na konec původního souboru, neexistuje-li soubor s
daným názvem vytvoří se nový)
"r+" otevře existující soubor pro čtení i zápis
"r"
"w"
"w+" otevře nový soubor pro čtení i zápis
"a+" otevře nový soubor pro čtení i zápis, při zápisu je nový
obsah zapsán na konec
Programování se soubory (3/7)
• funkce int fprintf(ukazatel na soubor, řetězec)
Funkce vloží formátovaný řetězec řetězec do otevřeného
souboru s povoleným zápisem, soubor je definován ukazatelem
ukazatel na soubor typu FILE.
• funkce int fclose(ukazatel na soubor)
Funkce uzavře soubor definovaný ukazatelem ukazatel na
soubor typu FILE.
Př. Sestavte program jako konzolovou aplikaci, který načte
šest jmen a uloží je do příslušného textového souboru
(každé jméno zvlášť na nový řádek, pořadí je počítáno
od 1) a to ve formátu:
pořadí. jméno
Programování se soubory (4/7)
#include <stdio.h>
int main(void)
{
int n;
char name[20];
FILE *ptrfile;
// index for loop
// string for name
// spec. type pointer to file
ptrfile=fopen("testfile.txt","w"); // open a new
file for writing and obtaining address
if(ptrfile!=NULL)
// if file is open
for(n=1; n<=6; n++)
{
printf("Insert %d. name: \n", n);
gets(name);
fprintf(ptrfile, "%d. %s\n", n, name);
//put string into the file
}
dgf
Programování se soubory (5/7)
fclose(ptrfile);
return 0;
// close the file
}
Příklad: BPC1E_Ex78.c
• funkce int fscanf(ukazatel na soubor, řetězec)
Funkce načte formátovaný řetězec řetězec z otevřeného
souboru s povoleným čtením, soubor je definován ukazatelem
ukazatel na soubor.
Programování se soubory (6/7)
Př. Sestavte program jako konzolovou aplikaci, který načte
šest pořadí a jmen z textového souboru (viz příklad
BPC1E_Ex78.c) a vytiskne je do konzolového okna.
#include <stdio.h>
int main(void)
{
int n, num;
char name[20];
// index for loop and number
// string for name
FILE *ptrfile;
// spec. type pointer to file
ptrfile=fopen("testfile.txt","r");
// open an existing file for reading and
// obtaining its address
Programování se soubory (7/7)
if(ptrfile!=NULL)
// if file is open
for(n=0; n<6 ; n++)
{
fscanf(ptrfile, "%d.", &num); //read
// number from the file
fscanf(ptrfile, "%s", name); //read
// string from the file
printf("%d. name: %s\n", num, name);
}
fclose(ptrfile);
getchar();
return 0;
}
Příklad: BPC1E_Ex79.c
// close the file
Záloha databáze v souboru (1/10)
• Při vhodné definici obsahu souboru pro zápis a čtení pomocí
formátovaných řetězců fprintf() a fscanf() lze soubor
využít jako zálohu vlastní databáze tak, aby data byla uchována
i po ukončení programu pracujícího s databází.
Př. Vytvořte program jako konzolovou aplikaci pro jednoduchý
elektronický index studenta.
Záznam předmětu v elektronickém indexu bude obsahovat
následující údaje:
• zkratka (řetězec, např. BPC1E),
• typ = povinnost (znak, např. P = povinný)
• počet kreditů (celé číslo)
• ročník (celé číslo)
• semestr (znak, Z = zimní, L = letní)
Záloha databáze v souboru (2/10)
• počet udělených bodů
Pro výše uvedené údaje navrhněte vhodnou strukturu a vytvořte pole 100 ukazatelů na tuto strukturu. Strukturu naplňte
údaji z textového souboru, ve kterém jsou zapsány postupně za
sebou na jednotlivých řádcích, poslední předmět, který již není
započítáván do indexu je identifikován zkratkou XXXX. Pro práci
s databází sestavte:
• funkci pro výpis indexu, každý předmět doplňte o vygenerování známky (A až F) na základě bodů.
• funkci pro přidání nového záznamu
• funkce pro výpočet počtu kreditů a celkového průměru
s výpisem na obrazovku.
Záloha databáze v souboru (3/10)
Struktura pro předmět
typedef struct t_course
{
char abbrev[5];
char type;
int
credits;
int
year;
char semester;
int
points;
};
Vložit do hlavičkového
souboru index.h
Databáze jako pole 100 ukazatelů
na záznamy předmětů
Záloha databáze v souboru (4/10)
Výpis předmětů:
Záloha databáze v souboru (5/10)
Přidání předmětu a výpočet studijního průměru:
Záloha databáze v souboru (6/10)
Hlavní program s ovládáním main.c (1/2)
#include <stdio.h>
#include <stdlib.h>
#include "index.h"
int main(void)
{
T_course
*my_index[100]; // ptrs. to courses
int
no_courses;
// number of records
char
cmd;
// command letter
no_courses = fill_index(my_index);
printf("ELECTRONIC INDEX \n\nInsert command:
\n\n'q' = quit \n'p' = print full index, \n'a' =
add a new course, \n's' = print study mean\n");
scanf("%c", &cmd);
dgf
fflush(stdin);
Záloha databáze v souboru (7/10)
Hlavní program s ovládáním main.c (2/2)
while(cmd!='q') // if not quit
{
switch(cmd)
{
case 'p': print_index(my_index, no_courses);
break;
case 'a': no_courses = insert_course(
my_index, no_courses); break;
case 's': print_stmean(my_index, no_courses);
}
printf("\n\nInsert command: … \n");
scanf("%c", &cmd); fflush(stdin);
};
save_erase_index(my_index, no_courses);
return 0;
}
dgf
Záloha databáze v souboru (8/10)
Hlavičky výkonných funkcí v knihovně index.h
int add_course(T_course **rec, int num, char
*new_abbrev, char new_type, int new_credits, int
new_year, char new_semester, int new_points);
char get_grade(int points);
float get_eval(int points);
int credit_sum(T_course **rec, int num);
float study_mean(T_course **rec, int num);
int fill_index(T_course **rec);
int insert_course(T_course **rec, int num);
void print_index(T_course **rec, int num);
void print_stmean(T_course **rec, int num);
void save_course(char *save_abbrev, char save_type, int
save_credits, int save_year, char
save_semester, int
save_points, FILE *pf);
void save_erase_index(T_course **rec, int num);
dgf
Záloha databáze v souboru (9/10)
Hierarchie použití funkcí
dgf
Záloha databáze v souboru (10/10)
Hierarchie použití funkcí
Příklad: BPC1E_Ex80.c
Příklady (1/6)
Př. Na automatickém pětimístném voltmetru bylo měřeno
napětí na výstupu stabilizátoru 3,3V LF33. Během
dlouhodobého měření byla naměřena sada výstupních
napětí stabilizátoru a uložena do souboru meas_LF33.dat,
kde jsou napětí uvedena jako číselné hodnoty oddělené
mezerou (případně koncem řádku). Poslední hodnota je 0
(ukončení souboru měření). Vytvořte program, která určí
počet naměřených hodnot, vygeneruje statistický histogram
(procentuální četnost) po intervalech 10 mV a určí
minimální napětí, maximální napětí, střední hodnotu a
směrodatnou odchylku z naměřených napětí.
Příklady (2/6)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n, m, ind, mv=0;
float V, maxV, minV, avV=0, roV=0;
int VtoV[40]; // voltage in 40 intervals 3.10-3.11,
3.11-3.12 to 3.49-3.50
FILE *ptrf;
for(n=0; n<40; n++)
VtoV[n]=0;
ptrf=fopen("meas_LF33.dat","r");
if(ptrf!=NULL)
// if file is open
{
Příklady (3/6)
fscanf(ptrf, "%f", &V);
minV=V;
maxV=V;
while(V!=0)
{
// printf("%f\n", V);
ind=floor((V-3.1)*100);
if(ind>=0 && ind<=39)
VtoV[ind]++;
if(V<minV)
minV=V;
if(V>maxV)
maxV=V;
mv++;
avV+=V;
roV+=V*V;
fscanf(ptrf, "%f", &V);
}
Příklady (4/6)
printf("\nNumber of measured values: %d\n", n);
printf("\nProbability characteristics:\n");
for(n=0; n<40; n++)
{
printf("\n(%4.2f - %4.2f) V", 3.1+n/100.0,
3.1+(n+1)/100.0);
m=VtoV[n];
while(m>0)
{
putchar(219);
m--;
}
printf(" - %4.1f %%", 100.0*VtoV[n]/mv);
}
printf("\n\nMinimum voltage: %f V\n", minV);
printf("\nMaximum voltage: %f V\n", maxV);
Příklady (5/6)
avV/=mv;
printf("\nAverage voltage: %f V\n", avV);
roV=1.0/mv*roV-avV*avV;
roV=sqrt(roV);
printf("\nStd. deviation of voltage: %f V\n", roV);
}
fclose(ptrf);
getchar();
return 0;
// close the file
}
Vztah pro výpočet směrodatné odchylky:
 ( X )  E X   E  X 
2
2
 1 N 2
    xi   x 2
 N i1 
Příklady (6/6)
Výstup programu po zpracování souboru naměřených napětí
Příklad: BPC1E_Ex81.c
DĚKUJI ZA POZORNOST
Téma následující přednášky
– Vazby dynamických proměnných
– Dynamická databáze