[C++] Przeciążanie strumienia wejścia/wyjścia
Ostatnio zmodyfikowano 2014-12-06 20:27
Kopczak1995 Temat założony przez niniejszego użytkownika |
[C++] Przeciążanie strumienia wejścia/wyjścia » 2014-12-06 17:08:34 Witam. Ostatnio dowiedziałem się o przeciążeniach operatorów oraz strumieni i bardzo mi się spodobały :) Niestety dotarłem do punktu, gdzie nie wiem jak z tego wybrnąć... Do rzeczy. Mam taką sobie strukturę (tylko dla ćwiczeń, mniejsza z przekazem :P ): struct car { struct wheel { string gumType; double width; double diameter; }; struct engine { double capacity; string fuelType; }; wheel Wheel; engine Engine; };
Wszystko było w porządku dopóki przeciążeniem strumienia wejścia operowałem na tych danych przy założeniu, że wszystko było wpisywane poprawnie i bezstresowo to szło. Jednak jako że uważam kod za pełny dopiero wówczas, gdy użyszkodnik nie jest w stanie wykrzaczyć mi programu wpisując błędne wartości, postanowiłem go zabezpieczyć przed wpisywaniem błędnych danych. No i pojawiły się schody... istream & operator >>( istream & in, car & Car ) { cout << "Typ ogumienia (zimowe/letnie) : "; for(;; ) { getline( in, Car.Wheel.gumType ); if( Car.Wheel.gumType == "letnie" || Car.Wheel.gumType == "zimowe" ) break; else { cout << endl << R "(Źle wprowadzono wartość! Ogumienie może być " zimowe " lub " letnie " !)" << endl << "Wpisz jeszcze raz: "; } } cout << "Szerokość opony: "; for(;; ) { if( in >> Car.Wheel.width ) break; else { cout << endl << "Źle wprowadzono wartość!" << endl << "Wpisz jeszcze raz: "; } } return in; }
Moja funkcja wyświetla po prawdzie wszystkie widoczne w strukturze elementy ale działa to na podobnej zasadzie, więc nie widzę sensu wlepiać całości. Także problem jest taki, że w przypadku, gdy jakiś delikwent wpisze mi wyraz w momencie gdy trzeba podać cyfrę (tak jak u góry mam szerokość opony i ktoś wpisze przykładowo w ten sposób: Szerokość opony: duża to nie wiem co zrobić. Oczywiście wiem co się dzieje - strumień wejścia wyrzuca nam błąd, bo łańcuch znaków nie może zostać przypisany do zmiennej typu całkowitego i trzeba go oczyścić, lecz niestety niesie to za sobą poważny problem... Mianowicie gdybym wcześniej wpisał już jakieś dane w obrębie owej funkcji, to w momencie oczyszczenia strumienia zostaną bezpowrotnie utracone i później nie będzie co wyświetlać. I tu pojawia się pytanie - jak można w jakiś sposób przywrócić strumień wejścia do stanu używalności bez straty uprzednio wpisanych danych? Czy może znacie inny sposób na to aby sobie z tym poradzić? Prosiłbym o pomoc :) |
|
Kaikso |
» 2014-12-06 19:19:00 |
|
Kopczak1995 Temat założony przez niniejszego użytkownika |
» 2014-12-06 19:43:30 @kaikso Nie nie nie i jeszcze raz nie... Mnie nie chodzi o coś tak banalnego jak pokazujesz... Tyle to ja umiem -.-
@down Hmmm... Właśnie zajarzyłem, że przecież odnoszę się referencyjnie do mojej struktury... Czemu ja zawsze szukam kłopotów tam gdzie ich nie ma :D Zerknę szybko na kod ale chyba palnąłem głupotę :D |
|
Kaikso |
» 2014-12-06 19:50:40 Jeśli nie chcesz tak tego zrobić to i tak musiałbyś tego użyć jeśli chcesz w pełni zabezpieczyć kod przed owym delikwentem, poza tym dane masz wpisane do struktury więc niczego nie stracisz. A wszystko poza poziomem bufora masz poprawnie zabezpieczone. W związku z tym nie rozumiem w czym tkwi problem? |
|
Kopczak1995 Temat założony przez niniejszego użytkownika |
» 2014-12-06 20:27:28 Dobra, jestem durny jak but :D Przekopiowałem funkcję, która miała mi pobierać od użyszkodnika "typ ogumienia" do innej funkcji po czym przerobiłem ale zapomniałem zmienić struktur, do których miało się to odnosić... No cóż... Walnąłem gafę :P
@Edit Dobra, w każdym razie wszystko mi teraz działa, a post który umieściłem jest bezsensowny :P Sorki :D |
|
« 1 » |