Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Przeciążanie strumienia wejścia/wyjścia

Ostatnio zmodyfikowano 2014-12-06 20:27
Autor Wiadomość
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 ):
C/C++
struct car {
    struct wheel {
        string gumType; //ogumienie
        double width; //szerokość opony
        double diameter; //średnica koła
    };
    struct engine {
        double capacity; //pojemność silnika
        string fuelType; //typ paliwa
    };
    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...
C/C++
istream & operator >>( istream & in, car & Car ) {
    cout << "Typ ogumienia (zimowe/letnie) : ";
    for(;; ) { //pętla działa aż użyszkodnik nie wpisze poprawnej wartości
        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(;; ) { //pętla działa aż użyszkodnik nie wpisze poprawnej wartości
        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 :)
P-122363
Kaikso
» 2014-12-06 19:19:00
Jak zabezpieczyć strumień przed wczytaniem niepoprawnych danych znajdziesz tutaj » Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja
P-122386
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
P-122392
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?
P-122393
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
P-122399
« 1 »
  Strona 1 z 1