čtení řádků ze souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

čtení řádků ze souboru – C / C++ – Fórum – Programujte.comčtení řádků ze souboru – C / C++ – Fórum – Programujte.com

 

Random321654
~ Anonymní uživatel
4 příspěvky
9. 2. 2015   #1
-
0
-

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.

Nahlásit jako SPAM
IP: 2a00:1028:9193:2d5a:4de1:...–
10. 2. 2015   #2
-
0
-

Když uživatel zadá 5, tak má přečíst pátý řádek?

hu

Nahlásit jako SPAM
IP: 2001:67c:1222:800:f529:1f...–
JoDiK
~ Anonymní uživatel
987 příspěvků
10. 2. 2015   #3
-
0
-

#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.

Nahlásit jako SPAM
IP: 88.103.228.–
10. 2. 2015   #4
-
0
-

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

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
10. 2. 2015   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 78.45.199.–
JoDiK
~ Anonymní uživatel
987 příspěvků
10. 2. 2015   #6
-
0
-

#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...

Nahlásit jako SPAM
IP: 88.103.228.–
oxidián0
Grafoman
10. 2. 2015   #7
-
0
-

#6 JoDiK řádky ale a jejich délku musí spočítat a uložit. Je otázka k čemu to chce a jak často to bude používat. Pokud to chce použít jen jednou tak by se ani celý soubor načítat nemusel, ale jen k místu které ho zajímá.
 

Nahlásit jako SPAM
IP: 78.45.199.–
JoDiK
~ Anonymní uživatel
987 příspěvků
10. 2. 2015   #8
-
0
-

#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...

Nahlásit jako SPAM
IP: 88.103.228.–
oxidián0
Grafoman
10. 2. 2015   #9
-
0
-

Dobře, tak už tě možná chápu. Takže by si to rozparsoval pomocí strtok a jako oddělovač by si použil \n. Jo tak to by bylo nejjednodušší.

Nahlásit jako SPAM
IP: 78.45.199.–
10. 2. 2015   #10
-
0
-

"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

Nahlásit jako SPAM
IP: 2001:67c:1222:800:f529:1f...–
Random321654
~ Anonymní uživatel
4 příspěvky
10. 2. 2015   #11
-
0
-

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..). :/

Nahlásit jako SPAM
IP: 2a00:1028:9193:2d5a:4964:...–
Random321654
~ Anonymní uživatel
4 příspěvky
10. 2. 2015   #12
-
0
-

Aneb dá se odkázat na určitý byt v souboru ? nějak jednoduše ?!

Nahlásit jako SPAM
IP: 2a00:1028:9193:2d5a:4964:...–
JoDiK
~ Anonymní uživatel
987 příspěvků
10. 2. 2015   #13
-
0
-

#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.

Nahlásit jako SPAM
IP: 88.103.228.–
Random321654
~ Anonymní uživatel
4 příspěvky
10. 2. 2015   #14
-
0
-

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.)

Nahlásit jako SPAM
IP: 2a00:1028:9193:2d5a:4964:...–
10. 2. 2015   #15
-
+1
-
Zajímavé

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

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

Moderátoři diskuze

 

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