
Čtení řetězců v Céčku
Ahoj, jak mohu v céčku efektivně načítat řetězce znaků?
Mám na mysli dynamicky alokované místo tak, aby to šetřilo paměť. Například mám místo pouze pro 10 znakový řetězec, ale kdybych náhodou chtěl načítat řetězec s >10 znaky, tak se místo třeba zdvojnásobí a když ani to nebude vyhovovat, tak se znovu zdvojnásobí.
dám příklad - chci uložit do 3 proměnných 3 slova ze vstupu.txt (jejich velikost dopředu neznám)
vstup.txt
{
auto
dinosaurusREX
pcporadnajenejlepsiporadna
}
-začínám s omezením na 10 znaků
načítám "auto" do proměnné A =>okej
načítám "dinosaurusREX" do proměnné B=>musí se zdvojnásobit paměť, pak se uloží
načítám "pcporadnajenejlepsiporadna" do proměnné C=>musí se dvakrát zdvojnásobit paměť(uvažuji, že omezení na 10 znaků je nějaká neměnná konstanta, šablona)
díky moc
Môžeš použiť funkciu getline, ktorá za teba spraví alloc a prípadne realloc.
Mohl bys mi prosím Tě napsat ten kus kódu, já jsem v céčku nováček a z těch pointerů a tak jsem zatím takový levý
.
V uvedenom odkaze je príklad. S čím konkrétne potrebuješ pomôcť? Ďalší príklad je tu: https://stackoverflow.com/questions/9171472/c-getline-how-to-deal-with-buffers-how-to-read-unknown-number-of-values-in/9171511#9171511
Edit: v tom príklade zo stack overflow chýba fclose a pár vecí by sa dalo napísať krajšie, ale v princípe tak nejako.
Moc se nevím rady s tím, jak to použít pro více proměnných char.
Ak potrebuješ viacero premenných s reťazcom, tak si musíš skopírovať načítanú hodnotu do nejakej vyhradenej pamäte. Takže použiješ malloc, strncpy (ukončiť nulovým znakom) a free.
No, chtěl bych to udělat tak, jako jsem to popsal v dotazu, čili mám textový soubor se slovy, každé slovo je na jedné řádce. A já bych si ty 3 slova chtěl odděleně uložit a poté s nimi pracovat. Akorát u nich předem neznám délku, a tak bych chtěl dynamicky alokovat pamět charu pro každé z nich, aby se neplýtvalo s pamětí. V céčku jsem fakt úplně lajk, tvojich rad si velice cením, ale i tak jsem mimo.
No však prebehneš celý súbor riadok po riadku. Počas toho každý riadok načitaš do dočasnej pamäte cez getline. Keď už ho máš v tej dočasnej premennej, tak poznáš jeho dĺžku, takže si alokuješ miesto pre nový reťazec a tam si ho prekopíruješ. Výhodou je, že si do pamäte odložíš len to, čo potrebuješ.
Druhá možnosť je, že načítaš celý súbor do pamäte. To potom prebehneš a uložíš si smerníky na začiatky riadkov. Konce riadkov nahradíš nulovým znakom. V takomto prípade bude výhodou, že budeš robiť len jednu alokáciu. V prípade, že potrebuješ mať všetky riadky aj tak v pamäti, tak táto druhá možnosť je asi lepšia.
Intuitivně chápu, jak to myslíš, ale problém je, že to s mým momentálním skillem prostě nenapíšu; proto jsem sem přišel o radu, jak to napsat.
Lol, to vyzerá, že si si neprišiel po radu ako to napísať, ale po riešenie.
Tá možnosť 2 by mohla vyzerať takto:
Výstup pre tvoj vstupný súbor potom vyzerá takto:
Čítam binárne, lebo chcem mať v pamäti presne to, čo je v súbore. Mohol by si to čítať aj textovo, ale to vyžaduje pár úprav (get_line bude jednoduchší, ale fread bude trochu zložitejší, pretože nerozlišuje medzi chybou a koncom súboru - viď dokumentácia).