Nacitanie fgets() a ulozenie riadku do pola – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Nacitanie fgets() a ulozenie riadku do pola – C / C++ – Fórum – Programujte.comNacitanie fgets() a ulozenie riadku do pola – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Stiflere
~ Anonymní uživatel
8 příspěvků
12. 11. 2013   #1
-
0
-

Zdravím, mám taký problém z textového dokumentu som potreboval aby mi vypísal všetko čo v ňom je ..to funguje 

FILE *fr;
    int *pole [4][4];
    char meno[50], ulica[50], dan[50], datum[50];
    int c,i,j;
    char *mena;
     if((fr = fopen("dan.txt", "r")) == NULL)
        printf("Subor sa nepodarilo otvorit.\n");
     else 
    //     for (i = 0; i < 4; i++ ){
  //         for (j = 0; j < 4; j++){
             while(!feof(fr)){            
           //    pole[i][j] = (int*)malloc(4*sizeof(int));                    
                  fgets(meno,50,fr);
???????????????????????????                   
                  fgets(ulica,50,fr);
                  fgets(dan,50,fr);
                  fgets(datum,50,fr);
                  fscanf(fr, "\n");
               printf("priezvisko meno: %s",meno);
               printf("ulica cislo: %s",ulica);
               printf("dan: %s",dan);
               printf("datum: %s\n",datum);
                }
            }
         } 
         fclose(fr);
}

Môj problém je v tom že chcem v ďalšej funckii používať všetky údaje (napríklad dan) ale neviem ako z daného cyklu vložiť do pola údaje ktoré sa týkajú riadku dan (chcem z toho spraviť maximum) 

ďakujem 

Nahlásit jako SPAM
IP: 95.103.123.–
Reklama
Reklama
hlucheucho+10
Posthunter
12. 11. 2013   #2
-
0
-

Jestli jde o konverzi řetězec - číslo, tak lze použít buď funkci atoi nebo formátované čtení sscanf. Lze číst formátovaně přímo ze souboru pomocí fscanf.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Stiflere
~ Anonymní uživatel
8 příspěvků
12. 11. 2013   #3
-
0
-

#2 hlucheucho

Ja potrebujem aby mi po príkaze fgets ukladalo napríklad mená. A potom v ďalšej funkcii by som si dané pole zavolal a mohol by som napríklad porovnávať tie mená

Nahlásit jako SPAM
IP: 95.103.123.–
hlucheucho+10
Posthunter
12. 11. 2013   #4
-
0
-

Pole jmen lze implementovat jako dvourozměrné pole char. Pole pro 10 jmen o délce max 49 tisknutelných znaků by vypadalo takto:

char jmena [10] [50];

a naplnění řádku (načtení jména):

fgets(jmena[2],50,fr);

Vhodnější mi připadá ke každému "jedinci" vytvořit strukturu se všemi jeho údaji (jméno, daň....) a tvořit jednorozměrné pole těchto struktur. Pokud by pole mělo být schopno pojmout proměnlivý počet záznamů, asi bych zvolil vector

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Stiflere
~ Anonymní uživatel
8 příspěvků
12. 11. 2013   #5
-
0
-

#4 hlucheucho
A keby som chcel tie mena pouzit v dalsej funkcii ako sa k nim dostanem? bez toho aby som znova otvarral subor a nacitaval

Nahlásit jako SPAM
IP: 95.103.123.–
hlucheucho+10
Posthunter
12. 11. 2013   #6
-
0
-

   

typedef struct poplatnik  {
  char jmeno[50];
  char ulica[50];
  int cislo_domu;
  float dan;
} POPLATNIK;

POPLATNIK poplatnici[10];  //pracuji s deseti poplatniky

//naplneni polozky struktury
fgets(poplatnici[2].jmeno,50,fr);

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Stiflere
~ Anonymní uživatel
8 příspěvků
12. 11. 2013   #7
-
0
-

#6 hlucheucho
ďakujem veľmi pekne :) 

Nahlásit jako SPAM
IP: 95.103.123.–
hlucheucho+10
Posthunter
12. 11. 2013   #8
-
0
-

Použití dat ze struktury pak vypadá takto:

if(poplatnici[4].dan > 1284)
{
  //co s tim preplatkem?
}

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Stiflere
~ Anonymní uživatel
8 příspěvků
12. 11. 2013   #9
-
0
-

#8 hlucheucho
A príkaz if(poplatnici[4].dan) môžem použiť aj v inej funkcii??? 

Nahlásit jako SPAM
IP: 95.103.123.–
hlucheucho+10
Posthunter
12. 11. 2013   #10
-
0
-

poplatnic[4].dan je možné použít jako r-value i jako l-value. Totéž platí i pro ostatní položky ve struktuře a všechny struktury v poli. Funkci předáš ukazatel na pole a v těle funkce můžeš dělat s polem co chceš.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Stiflere
~ Anonymní uživatel
8 příspěvků
12. 11. 2013   #11
-
0
-

 Strašne veľa chýb mi vyhadzuje !

error C2065: 'fr' : undeclared identifier

error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

error C2365: 'fclose' : redefinition; previous definition was 'function'

{
	typedef struct 
		poplatnik  {
            char meno[50];
            char ulica[50];
            int cislo_domu;
            float dan;
            } 
	      POPLATNIK;
		FILE *fr;
	    POPLATNIK poplatnici[4];
	             if((fr = fopen("dan.txt", "r")) == NULL)
                    printf("Subor sa nepodarilo otvorit.\n");
	             else 
		           while(!feof(fr)){			          
		             fgets(poplatnici[1].meno,50,fr); // chcem iba meno zatiaľ načíťať
				     fscanf(fr, "\n");
	                 printf("priezvisko meno: %s",poplatnici[1].meno); // iba meno vypísať 
				     }
		           } 
		   fclose(fr);
Nahlásit jako SPAM
IP: 95.103.123.–
hlucheucho+10
Posthunter
12. 11. 2013   #12
-
0
-

Použití nejedné funkce či datového typu vyžaduje vložit nějaký hlavičkový soubor. Zde by to měl být stdio.h. Dále by C program měl obsahovat alespoň funkci main

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Stiflere
~ Anonymní uživatel
8 příspěvků
12. 11. 2013   #13
-
0
-

#12 hlucheucho
Jo ten tam mám, chyba bola že mi chýbala "}" 

Ešte taká blbá otázka, ale fakt to mi robí vždy problém, ako mám presne pretypovať int cislo_domu; float dan;

do funcie fgets??? 

Nahlásit jako SPAM
IP: 95.103.123.–
hlucheucho+10
Posthunter
12. 11. 2013   #14
-
0
-

fgets přečte řádek jako řetězec a z něj pomocí sscanf přečteš číslo. Ještě jednodušší by bylo načíst číslo přímo ze souboru pomocí fscanf, v takovém případě musíš mít mechanismus který přečte (a ignoruje) znaky ukončující řádek.

Pokud to neodporuje zadání tak pro uložení dat jednoho poplatníka by bylo možné použít csv formát souboru. Řádek obsahuje data poplatníka oddělená středníky. Další řádek obsahuje data dalšího poplatníka. Takto lze jedním voláním fgets načíst všechna data jednoho poplatníka a pomocí strtok přečtený řádek rozdělit na jednotlivá data

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Stiflere
~ Anonymní uživatel
8 příspěvků
12. 11. 2013   #15
-
0
-

#14 hlucheucho
Prečo ak v príkaze POPLATNIK poplatnici[4]; zmením 4 na iné číslo mi to zblbne a čo vlastne to číšlo vyjadruje? 

Nahlásit jako SPAM
IP: 95.103.123.–
hlucheucho+10
Posthunter
12. 11. 2013   #16
-
0
-

POPLATNIK poplatnici[4];  //zde znamená počet prvků pole

Máš pole, které má 4 prvky, platné indexy jsou 0 až 3 včetně.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
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, 104 hostů

Moderátoři diskuze

 

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