abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 08:00 | Nová verze

    Distribuce Tails specializující se ochranu online soukromí uživatele byla vydána ve verzi 4.25. Přidává jednoduchý nástroj pro zálohování perzistentního prostoru, aktualizuje Tor Browser (11.0.2) a Tor (0.4.6.8) a opravuje několik chyb.

    Fluttershy, yay! | Komentářů: 0
    dnes 07:00 | Nová verze

    Vývojáři Plasma Mobile vydali novou verzi 21.12 tohoto prostředí a souvisejících aplikací pro mobilní zařízení. Přehled novinek v příspěvku na blogu. Zdůrazněn je přechod od oFono k ModemManager.

    Ladislav Hagara | Komentářů: 0
    dnes 06:00 | Zajímavý projekt

    Na Humble Bundle probíhá akce Humble Book Bundle: Programmer Advice That Wrox Your World by Wiley. Za zvýhodněnou cenu lze získat elektronické knihy věnované programování. Peníze lze rozdělit mezi nakladatelství, charitu a organizátory.

    Ladislav Hagara | Komentářů: 0
    včera 16:11 | Nová verze

    Webový prohlížeč Mozilla Firefox byl vydán ve verzi 95.0. Mezi změnami figuruje např. povolení Site Isolation všem uživatelům a izolace vybraných knihoven RLBox na všech platformách.

    Fluttershy, yay! | Komentářů: 15
    včera 12:33 | Nová verze

    Byla vydána verze 4.0 webového aplikačního frameworku napsaného v Pythonu Django (Wikipedie). Přehled novinek v poznámkách k vydání. Současně byly vydány verze 3.2.10, 3.1.14 a 2.2.25 řešící bezpečnostní chybu CVE-2021-44420.

    Ladislav Hagara | Komentářů: 1
    včera 12:11 | IT novinky

    Uživatelé služby mojeID, kterou provozuje sdružení CZ.NIC, mají nyní možnost zvolit si u svého účtu ověření na úroveň záruky „Vysoká“. Získají tím přístup ke všem elektronickým službám veřejné správy, včetně těch, které vyžadují nejvyšší zabezpečení. Mezi ty patří například založení a administrace majetkového účtu nebo on-line nákup státních dluhopisů. Uživatelů služby mojeID, kteří mají svůj účet propojený s Národním bodem pro identifikaci a autentizaci (NIA), je nyní téměř 40 tisíc.

    Ladislav Hagara | Komentářů: 2
    včera 07:00 | Komunita

    Konsorcium Linux Foundation zveřejnilo sedmaosmdesátistránkovou Výroční zprávu za rok 2021 (pdf).

    Ladislav Hagara | Komentářů: 0
    včera 00:33 | Komunita

    Vývojáři svobodného 3D softwaru Blender představili (Twitter) nejnovějšího firemního sponzora Blenderu. Je ním decentralizovaný virtuální svět Decentraland a úroveň sponzoringu je Patron, tj. minimálně 120 tisíc eur ročně.

    Ladislav Hagara | Komentářů: 0
    6.12. 15:33 | Zajímavý článek

    MojeFedora.cz v článku GNOME Shell: co se připravuje představuje možné novinky v GNOME Shellu: Nahrávání obrazovky, Rozlišení pozadí podle světlosti tématu, Rychlé přepínače, …

    Ladislav Hagara | Komentářů: 39
    6.12. 15:11 | Nová verze

    Byla vydána verze 8.0 linuxové distribuce Freespire (Wikipedie). Jedná se o bezplatnou linuxovou distribuci vyvíjenou společností PC/OpenSystems LLC stojící za komerční distribucí Linspire (Wikipedie), původně Lindows.

    Ladislav Hagara | Komentářů: 0
    Pracujete z domu?
     (33%)
     (31%)
     (16%)
     (2%)
     (16%)
     (2%)
    Celkem 189 hlasů
     Komentářů: 18, poslední 6.12. 14:51
    Rozcestník



    Dotaz: C nastavení parametrů fscanf()

    17.5.2011 11:46 Igor
    C nastavení parametrů fscanf()
    Přečteno: 910×
    Dobrý den, Mám vstupní soubor, kde na každém řádků je 5 řetězců znaků různé délky. Každý řetězec je oddělen mezerou, občas dvěmi. Jedtnotlivé řetězce jsem do svého programu načítal pomocí funkce fscanf().
    fscanf(fr, "%s %s %s %s %s", &retezec1, &retezec2, &retezec3, &retezec4, &retezec5);
    Můj problém je, že já potřebuju, aby z každého řetězce bylo načteno pouze 5 prvních znaků. Pokud jich je náhodou víc potřebuju, aby byly za pátým znakem useknuty. Definoval jsem si tedy proměné retezec jako pole 5 charů. Žil jsem v domění, že funkce fscanf automaticky řetězec usekne, ale neděje se tak. Pokud je náhodou řetězec delší program spadne.

    Je to jednoúčelový program a moc programování nerozumím, proto teď nevím moc jak dál. Dá se nějak funkce fscanf nastavit, aby z každého řetězce přečetla pouze prvních pět znaků do první proměné - poté přeskočila na další řetězec a načetla opět prvních 5 znaků do další proměné a tak dále?

    Předem děkuju za radu.

    Řešení dotazu:


    Odpovědi

    17.5.2011 11:55 miso | skóre: 36 | blog: iSCSI_initiator_howto | Praha
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    fscanf(fr, "%5s %5s %5s %5s %5s", &retezec1, &retezec2, &retezec3, &retezec4, &retezec5);
    Project Satan infects Calculon with Werecar virus
    17.5.2011 17:09 miso | skóre: 36 | blog: iSCSI_initiator_howto | Praha
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
        #include <stdio.h>
        #include <string.h>
         
        #define STR_MAX     32
        #define STR_SIZE     5
        #define TO_STR_SIZE "5"
        #define WORDS_IN_ROW 5
         
        int main(int argc, char *argv[])
        {
            FILE *f;
            f=fopen("file.txt", "r");
            if (f != NULL)
            {
                char str[WORDS_IN_ROW][STR_SIZE+1];
                int i;
                for (i=0;i<WORDS_IN_ROW;i++)
                {
                     fscanf(f, "%" TO_STR_SIZE "s", &str[i]);
                     str[i][STR_SIZE]='\0';
         
                     if (i<WORDS_IN_ROW-1)
                     {
                         char c;
                         if ((c=fgetc(f)) != ' ')
                         {
                             char tmp[STR_MAX];
                             fscanf(f, "%s ", &tmp);
                         }
                         else
                         {
                             ungetc(c, f);
                         }
                     }
                }
         
                for (i=0;i<WORDS_IN_ROW;i++)
                {
                    printf("%d: %s\n", i, str[i]);
                }
         
                fclose(f);
            }
            return 0;
        }
    
    Project Satan infects Calculon with Werecar virus
    17.5.2011 12:00 NN
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    fscanf(fr,"%5c", &retezec);
    ?

    NN
    17.5.2011 12:11 Igor
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    Děkuji, ale tohle má pokud vím za následek to, že to do retezec1 načte pět znaků ale nepřeskočí v souboru na další řetězec, a do retezec2 začne načítat další znaky ovšem z prvního řetězce tam kde skončil.
    17.5.2011 12:26 Atom321 | skóre: 20
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    Přes fscanf to nepůjde, bohužel.
    17.5.2011 12:32 Igor
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    A nějaká jiná funkce rozumnější existuje? Mě napadá leda číst po znaku nějakým fgetc() a počítat znaky, ale tam budu muset ještě hlídat mezery. Na fscanf() se mi líbilo, že jsem vůbec nemusel řešit mezery. A celkově to bylo jednoduchý a přehledný.
    skunkOS avatar 17.5.2011 12:58 skunkOS | skóre: 27 | blog: Tak nějak
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    Mno určitě bych použil komubinací funkcí STRTOK, FGETS.

    http://www.cplusplus.com/reference/clibrary/cstring/strtok/

    A napsat si funkci která bude vracet řetězec X prvních znaků z nějakého nadřetězce. Typicky "Popokatepetl" >>> char *vratXznaku(char*, int x = 5) >> "Popok"

    Tohle se dá samozřejmě udělat i s funkcemi ze string.h.
    http://martinrotter.github.io
    17.5.2011 13:02 Igor
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    Jasně to vypadá celkem reálně. Sice se v tom moc zatím nevyznám, ale to určitě nastuduju. Děkuju
    pavlix avatar 17.5.2011 13:05 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    Vždycky to jde udělat ručně, načíst celý řádek a po znacích ho zpracovávat. Všechny tyhle funkce slouží jen k ulehčění. Doporučuju si někdy aspoň cvičně to ruční zpracování napsat. Pak teprv pochopíš a oceníš, co ty zjednodušující funkce nabízejí.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    17.5.2011 14:15 jekub
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    char retezec1[MAX_LEN], ..., retezec5[MAX_LEN];
    fscanf(fr, "%s %s %s %s %s", retezec1, ..., retezec5);
    
    retezec1[5] = ... = retezec5[5] = '\0';
    
    
    C uz jsem dlouho neuzival, ale maji tam skutecne byt ty &?
    pavlix avatar 17.5.2011 14:28 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    Mno, ono to vůbec takhle používat nejde, kvůli přetečení.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    17.5.2011 23:25 l4m4
    Rozbalit Rozbalit vše Re: C nastavení parametrů fscanf()
    Nejjednodušší je neblbnout, použít formát %as (GNU rozšíření), takže to řetězce samo naalokuje libovolně dlouhé - a pokud je z nich zapotřebí vzít pouze prvních pět znaků, tak je triviálně oříznout po načtení způsobem
    if (strlen(s) > 5)
       s[5] = '\0';
    
    A nezapomenout pak uvolnit pomocí free().

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.