C++ - načítání předem neznámého počtu čísel
Ahoj, ahoj, ahoj! :D Tak jsem zase tu, a zase s novým problémem :D Tentokrát to snad nebude žádná hrůza - jak se dají elegantně načítat čísla, pokud nevím jejich přesný počet (mám úlohu na realokaci pole), a ani uspořádání (může být různý počet v řádkách, jediné co vím, je, že jsou odděleny mezerami), prostě mám načítat, dokud to nedojde k poslednímu číslu. Jak se to dá řešit co nejelegantněji?
Moc díky za odpovědi, Katsu
Edit: načítám normálně z konzole, ze vstupu, takže nemůžu použít EOF jako u souboru...
Já to vidím na cyklus WHILE.
Jo, cin ve whilu mě taky napadl, ale jak to udělat, aby načítal do konce prvků, když ten v konzoli není nijak označený a jejich počet neznám? Prostě mi nějak uniká ta podmínka :D
Načítáš prvky. Je jedno kolik jich je. Počítači (programu) ale přece musíš nějak oznámit, když vložíš/načteš poslední prvek. A právě to dáš do té podmínky.
Pripadá mi to ako dynamické (resizable) pole (array) - dynamic array...
No, abych to doplnil... Úkol je takový, že se zadá velikost pole a prvky. Program pak načítá prvky do pole, a pokud pole nestačí, tak se vypíše hlášení, že pole zdvojnásobilo velikost a prvky se načítají dál. A tak dál, dokud se nedojde na konec těch čísel...
Napadlo mě něco ve stylu:
Tady je problém opět ten, že cyklus nekončí, resp. po načtení všech čísel se neukončí, ale čeká na zadání dalších hodnot...
Tak si das do google cin c++ a studujes jakym sposobom je riesena indikacia konca konkretne u cin. Ak to indikaciu konca nema tak nepouzijes cin ale napr. getch alebo inu z miliona funkcii v nejakej kniznici ktoru zrovna v skole preberate.
Napr. tym googlom najdes referenciu http://www.cplusplus.com/reference/istream/istream /operator%3E%3E/
a zistis ze
Eofbit ani failbit mi v podmínce nefungují, program se ukončí po jediném průběhu cyklu / jede pořád. Dle popisu jsem myslel, že cin.failbit prostě vyhodí false, když narazí na prázdný znak za posledním číslem / mezerou, ale zjevně ne... Můžete mi napovědět trochu víc? :D
P.s.: Teď už to píšu jen pro zajímavost, tak jsem se vybodl na malloc atd (snažím se to psát v čistém C++) a koukám na vector... Myslím, že jak vyřeším to načítání, bude to ok
ked ti to nefunguje tak to robis blbo, eofbit urcite funguje. Ja nie som jasnovidec neviem co robis blbo.
to je totalna hovadina ziadne "ciste C++" neexistuje. Alokacia RAM ide v principe cez OS, takze slusne sa to riesi pomocou OS funkcii, univerzalne malloc a realloc su ale zaklad bez ktoreho sa nezaobides. "ciste C++" riesi pracu s objektami a ne alokaciu RAM bufferov apod.
Tady nefunguje podmínka u cyklu tak, jak bych chtěl - cyklus proběhne jen jednou a konec. Předpokládám, že jsem špatně pochopil ten .eofbit.
Jinak, čistým C++ jsem myslel např. používání new místo malloc při alokaci dynam. pole. Četl jsem, že malloc, realloc atd. mají různé nevýhody (nepracují s konstruktory?? :D)...
A zadal si tam viac cisel do jedneho riadku oddelene medzerou alebo jak zadavas tie cisla?
cin ma funkciu eof() je dobre testovat ju, neviem ci sa dostanes na memberov. Vsetko si mas citat na linkoch co som dal je tam o tom cela kapitola. cin ma aj memberov getc a este aj dalsich 100 memberov, vsetky mozes pouzivat, ak ti nevyhovuje IMHO dementny operator <<. Pred programovanim si to mas nastudovat.
Keby si nerobil "cistym C++" co znamena "nieco lepim a neviem co to robi lebo nikto nevidi do zdrojakov toho cin", ale ak by si pouzil nejake jasne a deterministicke fungujuce getch a vlastne kontroly a konverzne funkcie s presnym vysledkom a chybovymi hlaskami, tak si to mohol mat davno hotove a 100x lepsie jak lepit nejake C++ kniznice o ktorych nikto nevie jak presne funguju. Ak sa tie kniznice chces naucit kvoli nejakemu buducemu zamestnaniu tak OK, ale potom si najprv nastuduj vsetkych memberov triedy stream, a to do detailu cely popis navratove hodnoty atd.
Vzhledem k tomu, že přednášky jsou u nás dost o ničem (většina věcí se zmíní jen letmo, resp. na nejjednodušších příkladech a mnohé věci vůbec), snažím se nastudovat sám, co se dá, ale jde to pomalu, no... Ok, na třídu stream co nejdřív mrknu
Čísla zadávám oddělené vždy bílým znakem, tj. je jedno, jestli mezera nebo odsazení, prostě by to mělo načíst vše, co naráz zadám do konzole a na nic jiného to nečekat...
No tak vid co pisem nizssie, ta konverzia >> int zobere zo vstupu len cisla ale ne mezeru takze ta tam ostane donekonecna, musis to potom nejak testovat ze error a preskakovat po jednotlivych znakoch (asi fciou getc vyberat znaky) kym konverzia na int bude hlasit error (ne-cisla).
Napr. tuto som nasiel googlom narychlo http://stackoverflow.com/questions/4939251/cin-eof -functionality vidis pouzitie get() a putback() na testovanie, mne to pride uplne dementne ja by som skor skusal konverziu >> na int tak jak to mas, a ked by bol error tak by som vybral jeden znak (tu mezeru alebo co) fciou get() a nezvysoval i samozrejme, a pokracoval v cykle. Apod. Neviem zhlavy uplne do posledneho detailu ktore presne znaky vybera zo vstupu operator >>, si musis nastudovat. Myslim ze medzeru a CR-LF na vstupe necha a to je tvoj problem.
A inac musis si osetrit situaciu ked konverzia na integer neni mozna, co je napriklad u posledneho znaku CR-LF, co znamena novy riadok. To dementny operator << nevie skonvertovat na cislo tak nerobi nic, a teda ten znak ostane v buffri donekonecna. Teda musis testovat aj nejaku error condition dementneho operatora <<, na to je tam dalsi flag resp. funkcia.
jo táák :D ok, jdu googlit :D
... vector samozrejme mozes pouzit.
Daj si do google slova malloc a realloc (a free samozrejme)
V skole na vyucovani nabuduce nespat.