Potřebuji, aby když se odkážu na txt soubor s určitým číslem (řádek) aby mi to přiřadilo obsah řádku do řetězce. Děkuji za každou odpověd.
Fórum › C / C++
čtení řádků ze souboru
Když uživatel zadá 5, tak má přečíst pátý řádek?
hu
#1 Random321654
U textových souborů podle mých znalostí nelze skákat na konkrétní řádek. Takže ho budeš muset otevřít, číst z něj řádek po rádku a počítat si kolikátý řádek to je. Až dojdeš na hledaný řádek (nebo na konec souboru), vrátíš to, co jsi načetl, nebo chybu (když v souboru tolik řádků nebylo).
Pokud to má c/c++ jinak, tak se omlouvám, ale z principu věci to snad ani jinak nejde...
Leda snad nějaký příkaz, který načte celý soubor do paměti a další příkaz, který to rozdělí do struktury (pole) podle oddělovače řádků a pak už stačí vrátit položku na požadovaném indexu.
Zvolil bych nepatrně odlišný postup: číst po znacích. Co je za znakem ukončující řádek (bývá to <CR><LF>) znamená začátek dalšího řádku - inkrementuješ počitadlo řádků Když je počitadlo řádků o 1 menší, víš, že následující řádek je požadovaný řádek.. Pokud načteš EOF, je konec souboru.
hu
Já bych udělal čtení po řádcích a ukládat jednotlivé řádky do pole. Ale abys mohl přidělit paměť tak nejdříve potřebuješ zjistit kolik je tam řádků, tedy hledat zakončovací znaky. A vlastně potřebuješ zjistit i délku řádku, abys mohl přidělit paměť řádkům. Tak asi nejdříve zpočítat počet řádků. Pak udělat pole size_t * row_sizes; a přidělit tolik paměti kolik je tam řádků. Pak soubor procházet znova a počítat délku řádků a současně přidělovat paměť do bufferů uložených v poli typu unsigned char ** rows; Jakmile máme přidělenou paměť v tomto 2D poli, tak znova projít a uložit obsah řádků do jednotlivých bufferů.
Edit: Dalo by se to udělat i pomocí dvou smyček, pokud by si vytvořil dočasný buffer o velikosti souboru, do kterého budeš načítat aktuální řádek uvnitř druhé smyčky - tj. ta smyčka co má zjistit velikost řádku. Na konci cyklu jen přidělíš paměť a zkopíruješ daný počet bytů z bufferu do toho 2D pole.
#5 oxidián
Komplikovanějš, pomalejš a s většími nároky na paměť by to už nešlo? Především v zadání není požadavek na to, aby byl celý soubor v paměti...
Ale když už, tak pokud se ten soubor vejde do paměti, stačí ho přece přečíst jen jednou - velikost souboru je daná, tak se může zabrat pamět pro celý soubor, nejrychlejší možným způsobem se tam kompletně přenese a další hrátky se už pak dělají jen v operační paměti...
#7 oxidián
Nemusí, proč by to dělal? Přečti si ještě jednou zadání. BTW jde o typickou školní úlohu, takže nějaké úvahy o jakémkoliv využití jsou mimo mísu. No a protože tazatel ani jednou nereagoval, asi ho tu už nikdo neuvidí a tak si vlastně povídáme jen tak pro sebe...
"Polovičaté" řešení "hrubou silou": předpokládat, že max délka řádku bude např 255 znaků, pro načtený řádek mít statické pole char radek[256]; (v tom je ta polovičatost - nikde není dána max délka řádku) a pomocí fgets načíst celý řádek. S každým načteným řádkem inkrementovat počitadlo. Pokud počitadlo neukazuje požadované číslo řádku, obsah načteného řádku se ignoruje. Když počitadlo ukáže požadované číslo řádku, požadovaný řádek je v radek.
hu
Možná některé nepotěším, ale ještě mě uvidíte respektive mým hlavním problémem je získat počet řádků atd... vyzkoušel jsem i nějaké "funkční" kody z internetu jenže ty místo řádků počítali slova. Stačí mi vědět jak do pole char nahrát celý text nebo do stringu, a pak vědět jak "vytěsnit" jednotlivé znaky(strejda google nepomohl..). :/
Aneb dá se odkázat na určitý byt v souboru ? nějak jednoduše ?!
#12 Random321654
No, protože nejsi schopný vysvětlit co potřebuješ, ani nenapíšeš přesné zadání, těžko radit.
Je totiž možné, že to, co máš udělat, se dá udělat úplně jinak a jednodušeji než postupem, na který se ptáš.
Například ke zjištění počtu řádků v textovém souboru nepotřebuješ mít ani načtený celý text v paměti, ani nepotřebuješ skákat na určitý byt v souboru. Stačí přečíst znak po znaku celý soubor a spočítat kolikrát se vyskytuje znak (nebo posloupnost znaků podle verze souboru) konce odstavce.
Cílem je přiřadit řádky do řetězců tak, aby jsem se ně mohl odkazovat číslem, které reprezentuje jednotlivý řádek. Nebo se odkázat přímo na místo v souboru a tak přečíst určitý řádek. Jde mi jen o to, že když
x = 5 tak se odkážu na pátý řádek, který pak mohu dále načíst do řetězce. (Omlouvám se všem, co si lámali hlavu s mým problémem.)
std::string pro uložení řádku a std::vector jako pole řádků. Do stringu načtu řádek a string (načtený řádek) vložím do vectoru. S vektorem se dá pracovat podobně jako s polem, tedy pomocí indexů. Stejně jako pole se indexuje od 0. Na rozdíl od pole se string i vector samy realokují, není potřeba hlídat meze polí.
hu
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Čtení řádků v ".txt" souboru — založil Jirka
Nastavení velikosti pole pro čtení řádku z txt. — založil lukas011
čtení ze souboru — založil VitPet
Cteni souboru — založil marek321
Moderátoři diskuze