Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 25. červen 2009, 19:44:22 Předmět: riadok z .TXT suboru |
|
|
nikde som to nenasiel tak sa opytam tu.existuje v C nejaka funkcia ktora precita specificky riadok z .TXT suboru?
Naposledy upravil koso dne 26. červen 2009, 05:52:51, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 25. červen 2009, 19:58:10 Předmět: |
|
|
Ve standardni knihovne ne, musis si ji sam napsat. Predpokladam, ze to co chces, je precist n-ty radek. To, co potrebujes je preskocit prvnich n-1 radku (protoze v .TXT nejsou nikde informace o tom, kde v souboru radky zacinaji) a vratit nasledujici.
Nicmene pokud te zajima vic nez jen jeden radek, je cteni souboru timhle zpusobem dost neefektivni a je lepsi to cist najednou nebo si soubor projit a poznamenat si, kde zacinaji/konci jednotlive radky. _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 25. červen 2009, 20:08:20 Předmět: |
|
|
Čtení řádku jde udělat pomocí streamů s funkcí getline:
kód: |
string line;
getline(cout, line);
|
kde místo cout lze dosadit otevřený souborový stream.
Tohle načte řádek na aktuální pozici, takže je nutno jak říká ondrasej přečíst n-1 řádků a pak dostanu n. řádek.
EDIT: Teď jsem si všiml, že tazatel mluví o C. Můj příspěvek se týká jen C++  _________________ Mám strach
Naposledy upravil Quiark dne 25. červen 2009, 21:30:01, celkově upraveno 2 krát |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 25. červen 2009, 20:08:54 Předmět: |
|
|
no existuje fgets(). ktora cita urcity pocet znakov az do konca riadku. ak je riadok dlhy tak skonci skor a dalsie citanie bude pokracovat odtial kde skoncilo. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 25. červen 2009, 20:21:22 Předmět: |
|
|
mal som na mysli nieco take ako je v GML(jazyk GAME MAKERu) v ktorom som robil asi pred 3 rokmi
je tam funkcia file_read_real() ktora precita riadok textu a ulozi ho do premennej a potom je tam file_readln() ktora preskoci riadok
potreboval by som spravit to ze v texte vyhladam zadany retazec a precitam par riadkov pod nim pricom kazdy riadok ulozim do premennej. |
|
Návrat nahoru |
|
 |
Peta

Založen: 28. 07. 2007 Příspěvky: 154 Bydliště: V prvnim patre hned vedle koupelny.
|
Zaslal: 25. červen 2009, 21:21:00 Předmět: |
|
|
Pokud chceš analogii s GML, tak v C++ to uděláš tak, že přečteš celý řádek a uložíš do proměnný, pokud je to ten co Tě zajímá skončiš se čtením a proměnnou si zpracuješ. Pokud to není ten co chceš, prostě přečteš další řádek a uložíš do proměnné. Jak už tu bylo 2x řečeno, několik řádků prostě přeskočíš (n-1) a ten n-tý co tě zajímá si ponecháš. Pokud vím žádná speciální funkce na přeskakování řádků není. Ale to ani není potřeba, ty prostě ten řádek přečteš a ignoruješ jeho obsah. Ona ta funkce file_readln() stejně ten řádek přečte, jen ti to nikam neuloží takže tobě přijde že ho preskočí, protože po jejím skončení jsi na dalším řádku. _________________ Když je Ti smutno, otoč se tváří ke slunci a všechny stíny padnou za Tebe. |
|
Návrat nahoru |
|
 |
Ladis

Založen: 18. 09. 2007 Příspěvky: 1537 Bydliště: u Prahy
|
Zaslal: 25. červen 2009, 21:22:47 Předmět: |
|
|
No a dostáváme se k tomu, Koso, tam jsi na to měl předudělané funkce od autora GM, teď ses vrhl na nízkoúrovňovější C, takže si je musíš napsat sám, nebo použít nějakou cizí knihovnu. Záleží, co je cílem tvého snažení - lepit cizí knihovny a tutoriály, nebo se naučit programovat víc do hloubky v daném jazyce (který ti IMHO nemůžu doporučit). _________________ Award-winning game developer |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 26. červen 2009, 00:09:35 Předmět: |
|
|
Na kyho frasa ti je zrovna C++ ? Vyser sa na C++ a chod do C#/XNA kombinacie a usetris kopec casu a nervov.
Jo, a BTW :
No ale hned to zedituj. Ja teda vydrzim barsake hrubky, ale toto je podobny brutus, ako "syt" (ako vysivat - len nemam makcene instalnute, tak to hned nevidno). |
|
Návrat nahoru |
|
 |
koso
Založen: 28. 05. 2009 Příspěvky: 110
|
Zaslal: 26. červen 2009, 07:08:45 Předmět: |
|
|
uz som to vyriesil .ak treba vymazte tento topic. |
|
Návrat nahoru |
|
 |
VladR
Založen: 30. 07. 2007 Příspěvky: 1322 Bydliště: Greater New York City Area
|
Zaslal: 26. červen 2009, 08:33:19 Předmět: |
|
|
Tu nejde o tento topic, ale o princip. Dnes je dead simple najst na nete knihy o C++, nemusis davat stvrtinu priemerneho platu na knihu, ako kedysi.
PDFiek je take kvantum, ze aj ked nejakej knihe nerozumies, je vysoko nepravdepodobne, ze by si mal podobny problem pri hocakej z dalsich 15 knih.
Samozrejme to chce cas, nemozes chciet vysledky hned, ako pri GM. Potom si zober nejaky engine, ktory ma vizualne editory, kde low-level kodenia vela nemas a nemusis sa drbat s otvaranim suborov.
Na druhej strane, ak chces byt koderom, tak low-level veci proste ovladat musis - ale aj tak je lepsie zacat s C#, tam az tolko low-level zasekov nemas. |
|
Návrat nahoru |
|
 |
MD

Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 26. červen 2009, 08:59:11 Předmět: |
|
|
Ja stale s oblibou pouzivam scanf na cteni jednoduchych textovych konfiguraku. Dulezite je umet precist balast do konce radku plus onen konec radku abyste mohli preskocit chyby, komentare ci prazdne radky:
kód: |
fscanf(file,"%*[^\n]\n"); // readln
|
Vlastni cteni muze vypadat takto:
kód: |
if (fscanf(file, "%259[a-zA-Z_0-9] = \"%259[^\n\"]", buff, buff2) == 2) {
// precetl jsem radek ve formatu klic = "nejaka hodnota"
// pricemz to hlida limity delky klice i hodnoty (259) aby nepretekly buffery
// v buff mam klic a v buff2 mam hodnotu klice
}
fscanf(file,"%*[^\n]\n"); // readln
|
_________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 26. červen 2009, 10:32:45 Předmět: |
|
|
ja s oblibou pouzivam fgetc() v cyklu do-while. _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
Peta

Založen: 28. 07. 2007 Příspěvky: 154 Bydliště: V prvnim patre hned vedle koupelny.
|
Zaslal: 26. červen 2009, 13:16:52 Předmět: |
|
|
MD napsal: |
kód: |
if (fscanf(file, "%259[a-zA-Z_0-9] = \"%259[^\n\"]", buff, buff2)
|
|
OT:
Jsem ani nevěděl že jde do scanf hodit regexpy, je to někde popsané? (MSDN?). _________________ Když je Ti smutno, otoč se tváří ke slunci a všechny stíny padnou za Tebe. |
|
Návrat nahoru |
|
 |
JohnyDog

Založen: 17. 08. 2007 Příspěvky: 66
|
Zaslal: 26. červen 2009, 14:41:15 Předmět: |
|
|
Peta napsal: |
OT:
Jsem ani nevěděl že jde do scanf hodit regexpy, je to někde popsané? (MSDN?). |
Bohuzel ne regexpy, tohle ([]) je soucast format stringu, je to popsane ve standardu
citace: |
[
Matches a nonempty sequence of characters from a set of expected characters
(the scanset).246)
If no l length modi?er is present, the corresponding argument shall be a
pointer to the initial element of a character array large enough to accept the
sequence and a terminating null character, which will be added automatically.
If an l length modi?er is present, the input shall be a sequence of multibyte
characters that begins in the initial shift state. Each multibyte character is
converted to a wide character as if by a call to the mbrtowc function, with
the conversion state described by an mbstate_t object initialized to zero
before the ?rst multibyte character is converted. The corresponding argument
shall be a pointer to the initial element of an array of wchar_t large enough
to accept the sequence and the terminating null wide character, which will be
added automatically.
The conversion speci?er includes all subsequent characters in the format
string, up to and including the matching right bracket (]). The characters
between the brackets (the scanlist) compose the scanset, unless the character
after the left bracket is a circum?ex (^), in which case the scanset contains all
characters that do not appear in the scanlist between the circum?ex and the
right bracket. If the conversion speci?er begins with [] or [^], the right
bracket character is in the scanlist and the next following right bracket
character is the matching right bracket that ends the speci?cation; otherwise
the ?rst following right bracket character is the one that ends the
speci?cation. If a - character is in the scanlist and is not the ?rst, nor the
second where the ?rst character is a ^, nor the last character, the behavior is
implementation-de?ned.
|
_________________
 |
|
Návrat nahoru |
|
 |
MD

Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 26. červen 2009, 16:28:57 Předmět: |
|
|
jj, v MSDN to vysvetlene je. Jen je trosku hloupe, ze ta pomlcka (a-z) je "the behavior is implementation-defined." (cituju standard vyse). Ale pak se to cteni da napsat trosicku jinak, treba pro klice pouzit bezne %s (to pak precte text ohraniceny mezerami taby ci \n) a taky to bude fungovat.
Mne se tohle scanf libi, ze uz pak nemusim nic sam slozite parsovat. _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
 |
|