Načítání souboru do struktury – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načítání souboru do struktury – C / C++ – Fórum – Programujte.comNačítání souboru do struktury – C / C++ – Fórum – Programujte.com

 

Hanule
~ Anonymní uživatel
37 příspěvků
19. 12. 2013   #1
-
0
-

Dobrý den, načítán ze souboru txt, který má tuto strukturu, informace o jednotlivých autech jsou na řádních jednotlivých

<int - id><string - Znacka><string - Model><string - Barva><int - Pocet km><float-objem><int - cena>

např: 3 Fiat Panda ruzova 3454422 1,4 98765

Moje načítání ze souboru:

struktura je:

typedef struct autobazar    //struktura
{
    int id;
    char znacka[100];
    char model[100];
    char barva[100];
    int km;
    float objem;
    int cena;
} bazar;


a v mainu  vytvořené pole struktur:  

 bazar car[100];

 soubor je otevřen už otevřen a načítám takto:

int i = 0; 
while((c = fgetc(f)) !=  EOF)
    {
        while(fgetc(f)!='\n')
        {
            fscanf(f, "%d %99s %99s %99s %d %f %d", &car[i].id, &car[i].znacka, &car[i].model, &car[i].barva, &car[i].km,
                   &car[i].objem, &car[i].cena);
                  i++;
        }
    }

bohužel, při kontrolním výpisu potom např.

printf("%d",car[1].id)

to nevypisuje to co má, takže mám pravděpodobně někde chybu v samotném načítání. Bohužel nemohu přijít na to kde.

Děkuji za veškeré rady

Nahlásit jako SPAM
IP: 91.219.242.–
19. 12. 2013   #2
-
0
-

problém je v mezerách mezi čísly a nevhodném použití sscanf. Id ti asi načte dobře, ale dál bude číst do druhého parametru zbytek. Bych načetl celý řádek a pomocí strtok to rozdělil na tokeny a ty dále zpracoval - uložit do struktury (řetězec) nebo konvertoval na číslo (float nebo int). Druhá možnost (složitější) je načítat soubor po znacích do řetězce dokud není mezera nebo konec řádku. Při načtení mezery nebo konce řádku řetězec ukončíš znakem s hodnotou 0x00 a zpracuješ, při načtení konce řádku budeš vědět, že čteš poslední položku struktury. Problém je, že na konci řádku jsou často znaky CR LF.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Hanule
~ Anonymní uživatel
37 příspěvků
19. 12. 2013   #3
-
0
-

#2 hlucheucho
A jak se tam potom udělá "přeskok" na další řádek?

Chápu dobře, že bych si udělala pole charů, do kterého bych uložila jeden řádek, ten potom zparsovala podle mezer a jednotlivé části iuložila do struktury. Ale co s dalšími řádky?

Nahlásit jako SPAM
IP: 91.219.242.–
19. 12. 2013   #4
-
0
-

pomocí fgets přečteš celý řádek. Každé volání fgets přečte jeden řádek. Takže v těle cyklu přečteš řádek do pomocného řetězce pomocí fgets, ten budeš pomocí strtok uvnitř dalšího cyklu dělit na tokeny a ty zpracovávat na položky struktury - tento vnitřní cyklus ukončíš když jsou načteny všechny položky struktury nebo když strtok vrátí NULL. Vnější cyklus čtení ze souboru ukončíš když fgets vrátí EOF

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Hanule
~ Anonymní uživatel
37 příspěvků
20. 12. 2013   #5
-
0
-

#4 hlucheucho
Tak mě se to pořád nedaří. Udělala jsem toto. Ale nedaří se mi uložit jednotlivé tokeny do položek struktury.

A nevím, co by měla být podmínka foru. :(

char* str = (char *)malloc(sizeof(char)* 10);	//alokace pameti
    char* tok;					//pomocny string
    while((c = fgetc(f)) !=  EOF)
    {
        fgets(str,"%s",f);      //nacte radek
        tok = strtok(str," ");  //rozdeli podle mezer
        for(int i = 0; i < ???; i++)
        {
            while(tok != NULL)
            {
               
                car[i].znacka = tok;		//???
                printf("%s",car[0].znacka);
                tok = strtok(NULL," ");
            }
        }
    }
Nahlásit jako SPAM
IP: 91.219.242.–
Hanule
~ Anonymní uživatel
37 příspěvků
20. 12. 2013   #6
-
0
-

#5 Hanule
Jak udělat uložení právě té části tokenu do struktury? takhle se mi to ukládá nějak chaoticky.

    char* str = (char *)malloc(sizeof(char)* 10);
    char* tok;
    while((c = fgetc(f)) !=  EOF)
    {
        fgets(str,"%s",f);      //nacte radek
        tok = strtok(str," ");  //rozdeli podle mezer
        for(int i = 0; i < MAX; i++)
        {
            while(tok != NULL)
            {
                printf("%s\n",tok);
                car[i].id = atoi(tok);
                strcpy(car[i].znacka,tok);
                strcpy(car[i].model,tok);
                strcpy(car[i].barva,tok);
                car[i].km = atoi(tok);
                car[i].objem = atoi(tok);
                car[i].cena = atoi(tok);


                tok = strtok(NULL," ");
            }
        }
    }
    puts("");
Nahlásit jako SPAM
IP: 91.219.242.–
20. 12. 2013   #7
-
0
-

Popis a ukázka, jak použít fgets je např na  http://www.cplusplus.com/reference/cstdio/fgets/  . Jinak čtení souboru po řádcích by vypadalo asi takto:

#define SIZE  128

char radek[SIZE]; //sem se ulozi precteny radek
FILE *fr;          //soubor který budu cist

//nejdrive otevres soubor, v ilustracnim kodu vynechano
while (NULL != fgets(radek, SIZE, fr)
{
  ZpracujRadek();
}
  

ve funkci  ZpracujRadek();  pak řádek rozdělíš na tokeny a naskládáš do struktury. Jde to udělat i přímo v těle cyklu. Velikost bufferu pro řádek danou makrem SIZE si uprav tak, aby se tam vešel celý řádek.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kachna
~ Anonymní uživatel
2 příspěvky
6. 5. 2015   #8
-
0
-

#7 hlucheucho
Ahoj, snažím se o něco podobného

mám strukturu tu chci vždy při změně uložit do souboru a při zapnutí programu ju načíst ze souboru do struktury

zatím bojuji s načtením do struktury 

motivoval jsem se tímto: 

po stisknutí tlačítka provede toto:

#define SIZE  128             

char radek[SIZE];
FILE *fp;
fp = fopen("data.txt", "wb");

while (NULL != fgets(radek, SIZE, fp)
{

}


fclose(fp);

ale to while mi furt vyhazuje chybu a nevím proč (Visual studio 2013)

Struktura

typedef struct t_auto
{
    char znacka[30];
    char model[20];
    char palivo[20];
    int rok;
    int cena;
    int km;
    int id;
}
a_auto;

poradí někdo jak by vypadalo načtení do struktury a pak zase uložení?

nebo je nějaká možnost jak uložit strukturu aby i po zapnutí bylo vše uloženo a dalo se to editovat?

Nahlásit jako SPAM
IP: 93.99.143.–
6. 5. 2015   #9
-
0
-

Chyba při překladu nebo za běhu? Možná jsi zapomněl nějaký #include. Bez popisu chyby, se to nedá určit.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
Kachna
~ Anonymní uživatel
2 příspěvky
6. 5. 2015   #10
-
0
-

při překladu

#pragma once

Připojen obrázek.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ev_car.h"

Nahlásit jako SPAM
IP: 93.99.143.–
7. 5. 2015   #11
-
0
-

expected a ´)´ ... ti to přímo říká. Stačí si spočítat závorky

Že si toho překlepu za celou dobu nikdo nevšiml.  

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:415f:68...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Nacitani souboru v C — založil latis

Nacitani souboru — založil tester

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý