Diskuze: Implementace struktury do souboru
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 4 zpráv z 4.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Ako príklad uvádzam tento kód:
#include <stdio.h>
#define POCET 5
typedef struct {
char meno[30];
char odbor[30];
int rocnik;
} STUDENT;
void nacitaj_struktury(STUDENT *student);
void vypis_struktur(STUDENT * student);
int uloz_pole_do_suboru(STUDENT * student, char* nazov_suboru);
int nacitaj_pole_zo_suboru(STUDENT * student, char* nazov_suboru);
int main(void)
{
STUDENT student[POCET];
nacitaj_struktury(student);
uloz_pole_do_suboru(student, "test.txt");
//nacitaj_pole_zo_suboru(student, "test.txt");
system("CLS");
vypis_struktur(student);
return 0;
}
// funkcia nacita struktury do pola
void nacitaj_struktury(STUDENT *student)
{
int i;
// zadanie struktur do pola
for (i = 0; i < POCET; i++) {
system("CLS");
printf("Zadanie noveho studenta:\n");
printf("Meno a priezvisko: ");
scanf(" %30[^\n]s", student[i].meno);
printf("Ucebny odbor: ");
scanf(" %30[^\n]s", student[i].odbor);
printf("V ktorom je rocniku: ");
scanf("%d", &student[i].rocnik);
}
}
// funkcia vypise struktury z pola
void vypis_struktur(STUDENT * student)
{
int i = 0;
printf("Vypis studentov:\n");
for (i = 0; i < POCET; i++) {
printf("%d. student\n", i + 1);
printf("Meno a priezvisko: %s\n", student[i].meno);
printf("Ucebny odbor: %s\n", student[i].odbor);
printf("Je v %d rocniku.\n", student[i].rocnik);
putchar('\n');
}
}
// ulozi pole struktur do suboru
int uloz_pole_do_suboru(STUDENT * student, char* nazov_suboru)
{
FILE *fw;
int i;
if ((fw = fopen(nazov_suboru, "w")) == NULL)
{
printf("Subor %s sa nepodarilo vytvorit.\n", nazov_suboru);
return -1;
}
for (i = 0; i < POCET; i++) {
fprintf(fw, "%s;%s;%d\n", student[i].meno, student[i].odbor,
student[i].rocnik);
}
if (fclose(fw) == EOF) {
printf("Subor %s sa nepodarilo zavriet.\n", nazov_suboru);
return -1;
}
return 0;
}
// funkcia nacita pole struktur zo suboru
int nacitaj_pole_zo_suboru(STUDENT * student, char* nazov_suboru)
{
FILE *fr;
int i;
if((fr = fopen(nazov_suboru, "r")) == NULL)
{
printf("Subor %s sa nepodarilo otvorit.\n", nazov_suboru);
return -1;
}
for (i = 0; i < POCET; i++)
fscanf(fr," %[^;];%[^;];%d\n", student[i].meno, student[i].odbor, &student[i].rocnik);
if (fclose(fr) == EOF)
{
printf("Subor %s sa nepodarilo zavriet.\n", nazov_suboru);
return -1;
}
return 0;
}
Po prvom spustení programu zadáš 5 študentov a vytvorí sa súbor
test.txt.
Pred druhým spustením, uprav funkcie main nasledovne:
int main(void)
{
STUDENT student[POCET];
//nacitaj_struktury(student);
//uloz_pole_do_suboru(student, "test.txt");
nacitaj_pole_zo_suboru(student, "test.txt");
system("CLS");
vypis_struktur(student);
return 0;
}
a uložený súbor sa načíta do poľa štruktúr.
Jen otázka jestli je nutné ukládat řetězce. Pokud by to podmínky dovolily, nebylo by jednodušší uložit do souboru strukturu binárně? I vzhledem k tomu, že například u čísel to ušetří místo.
Máš pravdu, je to jednoduchšie, ale v samotnom bin súbore už neurobíš
žiadnu zmenu, kdežto v txt áno.
Dopĺňam funkcie na zápis a čítanie bin súboru.
int uloz_pole_do_bin_suboru(STUDENT * student, char* nazov_suboru)
{
FILE *fw;
if ((fw = fopen(nazov_suboru, "wb")) == NULL)
{
printf("Subor %s sa nepodarilo vytvorit.\n", nazov_suboru);
return -1;
}
fwrite(student, sizeof(STUDENT), POCET, fw); // od adresy &pole[0] sa do súboru fw uloží POCET položiek o veľkosti sizeof(int)
if (fclose(fw) == EOF) {
printf("Subor %s sa nepodarilo zavriet.\n", nazov_suboru);
return -1;
}
return 0;
}
int nacitaj_pole_z_bin_suboru(STUDENT * student, char* nazov_suboru)
{
FILE *fr;
int i;
if((fr = fopen(nazov_suboru, "rb")) == NULL)
{
printf("Subor %s sa nepodarilo otvorit.\n", nazov_suboru);
return -1;
}
fread(student, sizeof(STUDENT), POCET, fr);
if (fclose(fr) == EOF)
{
printf("Subor %s sa nepodarilo zavriet.\n", nazov_suboru);
return -1;
}
return 0;
}
použitie
uloz_pole_do_bin_suboru(student, "test.bin");
nacitaj_pole_z_bin_suboru(student, "test.bin");
Zobrazeno 4 zpráv z 4.