Konec října a začátek listopadu je sice obdobím polosemestrálních zkoušek, ale i přesto zkusím hodit do placu další hádanku. Za poslední tři hádanky byl průměr odpovědí čístá nula, takže i když se ani teď nikdo neozve, tak průměr neklesne. Je třeba myslet pozitivně :). Dneska se bude řešit korektní načítání čísel ze vstupu pomocí C++ proudů (streams).
Zadání
Vašim úkolem je zjistit, který z následujících způsobů je použitelným způsobem pro všech načítání čísel typu int
oddělených bílými znaky ze standardního vstupu do seznamu. Neuvažujte přetečení. Použitelný znamená, že neobsahuje chybu, neskončí v nekonečném cyklu, přečte všechna čísla atd. U každého ze způsobů uveďte, zda je či není použitelný, a pokud není, tak důvod.
a)
list<int> l; while (!cin.eof()) { int x; cin >> x; if (!cin.eof()) l.push_back(x); }
b)
list<int> l; while (!cin.fail()) { int x; cin >> x; if (!cin.fail()) l.push_back(x); }
c)
list<int> l; while (cin.good()) { int x; cin >> x; if (cin.good()) l.push_back(x); }
d)
list<int> l; while (cin) { int x; cin >> x; if (cin) l.push_back(x); }
e)
list<int> l; int x; while (cin >> x) { l.push_back(x); }
f)
list<int> l; copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(l));
Výše uvedené příklady jsou zapsány podle normy ISO C++98. U všech příkladů předpokládejte, že je dáno následující:
#include <iostream> #include <iterator> #include <algorithm> #include <list> using namespace std;
Řešení
Možnosti b, d, e a f jsou v pořádku. U možnosti a nastane problém v případě, kdy se na vstupu objeví něco jiného než číslo - dojde k zacyklení (testuje se pouze konec souboru). U možnosti c je problém, že se může stát, že se nenačte poslední číslo před koncem souboru (cin.good()
vrací true
pouze pokud jsou všechny stavové bity nulové, ale pokud se narazí na konec souboru, tak se nastaví eof bit).
Zveřejněno řešení #9
Zveřejnil jsem řešení devátého úkolu.