Cin do zmiennej [obsługa błędów (wyjątków) C++]

0

Witajcie! Potrzebuję pomocy odnośnie obsługi błędów w C++. W założeniach ten program ma wczytywać jakąś liczbę i pisać "Wszystko OK" jeżeli się to powiedzie. Jeśli się nie powiedzie, wypisuje "Błąd: ", a następnie wartość która jest błędna (tak wiem, że powinien też wypisywać jaka zmienna jest zła, bla bla bla, ale tutaj akurat chodzi mi tylko o to, że nie mogę tego wczytać...). My chcemy, żeby wartości były niepoprawne, ponieważ musimy przetestować obsługę błędów :P. Problem polega na tym, że gdy program znajdzie błąd '(!cin)' ładnie daje to runtime_error'a. Niestety, nie może przekazać tego, co wpisaliśmy do strumienia do zmiennej, żeby to potem wyświetlić (albo tak się dzieje, a ja używam po prostu źle jakiś funkcji :S). Mój kod wygląda tak:

#include <std_lib_facilities.h>
#include <conio.h>

void error(string s1)
{
    throw runtime_error(s1);
}

int main()
try{
    system("chcp 1250");

    cout << ":> ";

    string s1;
    double d = 0;
    cin >> d;
    if (!cin)
    {
        istream& get (string& s1); error(s1);
    }
    else cout << "Wszystko OK!";
    _getch();
    return 0;
}

catch (runtime_error& e)
{
    cerr << "Błąd: " << e.what();
    _getch();
    return 1;
}

catch (...)
{
    cerr << "Niespodziewany błąd!";
    _getch();
    return 2;
}

PS: std_lib_facilities.h to jest plik nagłówkowy, który zawiera w sobie większość "standardowych" (takich jak chociażby wszystkie stream'y) plików nagłówkowych.

EDIT: Nie działa wczytywanie strumienia do zmiennej. Byłem idiotą, że nie sprawdziłem od razu co zawiodło. Sory :P
EDIT2: Co nie znaczy, że wiem, jak dać cin'a do zmiennej (w tym przypadku).

2

istream& get (string& s1)
Wiesz co to robi? Nic, to jest deklaracja funkcji get przyjmującej referencję do string i zwracająca referencję do istream, a chyba nie o to Ci tu chodziło.

2

Wczytanie tylko i wyłącznie liczby przy pomocy cin wygląda tak:

int i = 0;
while(!(std::cin >> i))
{
    std::cin.clear();
    std::string str;
    std::getline(str); // co do tego nie jestem pewien czy zadziała.
    std::cout << "Podaj liczbę, a nie " << str;
}
0

@winefresh

Mógłbyś napisać jaki konkretnie napis? Byłbym bardzo wdzięczny :).

Nie chcę się tutaj wymądzrzać, ale jeżeli do int damy string, to [zmienna] int (w naszym wypadku 'd') będzie miała wartość "losową", nie wiem jak to się zwie, w każdym razie "dziwną". Dlatego pytam się jak zrobić to tak, żeby działało (czyli wyciągnąć to co wpisaliśmy i przypisać do zmiennej).

Jestem początkującym programistą, więc nie oczekuj ode mnie, że będę wiedział wszystko. Co do myślenia - pomyślałem. Użyłem istream& get ( string& s1 ), ponieważ znalazłem definicję 'istream& get ( char& c )' - "Extracts a character from the stream and stores it in c.", a więc "wyjmuje znak ze strumienia i przypisuje (umieszcza) w 'c' ". Skoro działa z char'em to pomyślałem, że ze stringiem też powinno zadziałać. Zamieniłem istream& get ( char& c )</code> na <code>istream& get ( string& s1 ), ponieważ skoro "wyjmuje" ze strumienia i przechowuje, to powinno zadziałać. Niestety nie działa. Domyśliłem się, że może jednak ta funkcja ma inne zastosowanie, a że nie znalazłem nic innego to napisałem tutaj. Próbowałem też jednocześnie przesłać wpisane znaki do 2 zmiennych (int i string), ale się nie udało. Nie da się zrobić konwersji string na int, więc kolejny sposób do kosza. Przypomniało mi się coś, co się zwało "zapis wartości", przekazanie wartości. Jak zwał tak zwał. Za pomocą operatora << czy >> (próbowałem oba) przekazujemy wartość... Czy jakoś tak, akurat gdzieś tylko zauważyłem, że coś takiego jest, więc spróbowałem :S. Więc nie pisz proszę, że nie myślę, bo używam mózgu. Ogranicza mnie jak na razie tylko poziom wiedzy, gdyż dopiero się uczę :].

1

Osztyzłyiniedobry. Zacznij od nauki wywoływania funkcji, a nie od wyjątków i obsługi błędów przy pomocy strumieni. Uczymy się od prostych rzeczy do trudniejszych, a nie na odwrót!

1
kapi12c napisał(a)

To jest chyba przekazanie przez referencję, tak? :P Ludzie, zrozumcie, że jestem początkującym programistą, więc tak, nie wiem wszystkiego. Zamiast kłócić się odnośnie mojej wiedzy może ktoś by po prostu "pokazał" mi jak to zrobić?

No przecież wszystko już zostało powiedziane, ale masz jeszcze dokładniej.
1)rzucasz wyjątek
2)łapiesz wyjątek
3)kasujesz flagi błędów strumienia (metoda clear)
4)pobierasz to co siedzi w strumieniu do jakiegoś stringa
5)wypisujesz tego stringa na wyjście

Ale do zabawy z wyjątkami wypadałoby chociaż wiedzieć co to są klasy, obiekty, dziedziczenie, a Ty nie rozróżniasz wywołania funkcji od jej deklaracji(odpowiedź na pytanie: NIE to nie jest przekazanie przez referencję, to jest zwykła deklaracja funkcji).

0

Ludzie, zrozumcie, że jestem początkującym programistą, więc tak, nie wiem wszystkiego.

Rozumiemy, ale nikt tutaj podstaw nie będzie wykładać. Piszesz, że uczysz się z książką. Do lektury jednak się dobrze nie przyłożyłeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0