Portál AbcLinuxu, 10. května 2025 03:27

Dotaz: C nastavení parametrů fscanf()

17.5.2011 11:46 Igor
C nastavení parametrů fscanf()
Přečteno: 947×
Odpovědět | Admin
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:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

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()
Odpovědět | | Sbalit | Link | Blokovat | Admin
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()
Odpovědět | | Sbalit | Link | Blokovat | Admin
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()
Odpovědět | | Sbalit | Link | Blokovat | Admin
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()
Odpovědět | | Sbalit | Link | Blokovat | Admin
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()
Odpovědět | | Sbalit | Link | Blokovat | Admin
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, (c) 1999-2007 Stickfish s.r.o.