IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
capandova3
Člen
Avatar
capandova3:14.1.2015 15:07

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):15.1.2015 13:46

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 Valkovič:15.1.2015 21:10

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 Valkovič
Libor Šimo (libcosenior):16.1.2015 13:25

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.