Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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...

Předmět Autor Datum
Já to vidím na cyklus WHILE.
host 11.12.2012 17:50
host
Jo, cin ve whilu mě taky napadl, ale jak to udělat, aby načítal do konce prvků, když ten v konzoli n…
Katsushiro 11.12.2012 17:55
Katsushiro
Načítáš prvky. Je jedno kolik jich je. Počítači (programu) ale přece musíš nějak oznámit, když vloží…
host 11.12.2012 18:27
host
(mám úlohu na realokaci pole) Pripadá mi to ako dynamické (resizable) pole (array) - dynamic array.…
pme 11.12.2012 18:15
pme
No, abych to doplnil... Úkol je takový, že se zadá velikost pole a prvky. Program pak načítá prvky d…
Katsushiro 11.12.2012 20:24
Katsushiro
Tak si das do google cin c++ a studujes jakym sposobom je riesena indikacia konca konkretne u cin. A…
MM.. 11.12.2012 21:17
MM..
Napr. tym googlom najdes referenciu http://www.cplusplus.com/reference/istream/istream /operator%3E%…
MM.. 11.12.2012 21:21
MM..
Eofbit ani failbit mi v podmínce nefungují, program se ukončí po jediném průběhu cyklu / jede pořád.…
Katsushiro 12.12.2012 17:03
Katsushiro
ked ti to nefunguje tak to robis blbo, eofbit urcite funguje. Ja nie som jasnovidec neviem co robis…
MM.. 12.12.2012 17:11
MM..
#include<iostream> #include<vector> using namespace std; int main(){ int delka; cin >> delka; vector…
Katsushiro 12.12.2012 17:23
Katsushiro
A zadal si tam viac cisel do jedneho riadku oddelene medzerou alebo jak zadavas tie cisla? cin ma fu…
MM.. 12.12.2012 17:45
MM..
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 nej…
Katsushiro 12.12.2012 17:59
Katsushiro
No tak vid co pisem nizssie, ta konverzia >> int zobere zo vstupu len cisla ale ne mezeru takze ta t… poslední
MM.. 12.12.2012 18:04
MM..
A inac musis si osetrit situaciu ked konverzia na integer neni mozna, co je napriklad u posledneho z…
MM.. 12.12.2012 17:48
MM..
jo táák :D ok, jdu googlit :D
Katsushiro 12.12.2012 18:02
Katsushiro
... vector samozrejme mozes pouzit.
MM.. 12.12.2012 17:15
MM..
Daj si do google slova malloc a realloc (a free samozrejme) V skole na vyucovani nabuduce nespat.
MM.. 11.12.2012 21:15
MM..

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:

int vstup;
int i = 0;
while(cin >> vstup){
   pole[i] = vstup;
   ++i;
}

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

Napr. tym googlom najdes referenciu http://www.cplusplus.com/reference/istream/istream /operator%3E%3E/
a zistis ze

Errors are signaled by modifying the internal state flags:
eofbit The end of the source of characters is reached during its operations.

failbit The input obtained could not be interpreted as an element of the appropriate type.
Notice that some eofbit cases will also set failbit.

badbit An error other than the above happened.

(see ios_base::iostate for more info on these)

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.

snažím se to psát v čistém C++

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.

#include<iostream>
#include<vector>

using namespace std;

int main(){

	int delka;

	cin >> delka;

	vector<int> cislo(delka);

	int i = 0;
	do{
		cin >> cislo[i];
		++i;
	}while(!cin.eofbit);

	//kontrola
	for(int j = 0; j < delka; ++j){
		cout << cislo[i] << " ";
	}
	cout << endl;
	
	return 0;
}

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.

Zpět do poradny Odpovědět na původní otázku Nahoru