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

Člen

Zobrazeno 4 zpráv z 4.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.