Diskuze: Implementace struktury do souboru

C++ C a C++ Implementace struktury do souboru

Avatar
capandova3
Člen
Avatar
capandova3:

Ahoj, mám takový dotaz, potřebuji otevřít soubor, a do něj nahrát struktury a přitom text, který obsahuje soubor převést na struktury, abych s nimi mohla dále pracovat. Budu vděčná za jakoukoliv radu. Děkuji :-)

 
Odpovědět 14.1.2015 15:07
Avatar
Odpovídá na capandova3
Libor Šimo (libcosenior):

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.

Nahoru Odpovědět 15.1.2015 13:46
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

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.

Nahoru Odpovědět 15.1.2015 21:10
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na patrik.valkovic
Libor Šimo (libcosenior):

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");
Nahoru Odpovědět 16.1.2015 13:25
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.