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

Obsługa strumienia wejściowego

Ostatnio zmodyfikowano 2014-07-06 23:03
Autor Wiadomość
Gaara
Temat założony przez niniejszego użytkownika
Obsługa strumienia wejściowego
» 2014-07-06 21:35:55
Witam, dziś ktoś założył podobny temat, ale niestety mam trochę inny problem.
A więc..dziś sobie przerabiałem temat http://cpp0x.pl/kursy/Kurs-C++​/Poziom-1​/Obsluga-strumienia-wejscioweg​o​/12. Niby wszystko zrozumiałem, przeczytałem całą treść i zacząłem robić ZADANIE DOMOWE z tego działu. Dokładna jego treść to :
"Napisz program, który wczyta trzy liczby rzeczywiste, a na końcu programu je wszystkie wypisze. Zadbaj o to, by bufor strumienia wejściowego był za każdym razem czyszczony. Wynik końcowy powinien również zawierać informacje czy wczytanie danej liczby się powiodło."
Niestety mój problem polega na tym, że póki wszystkie dane użytkownik poda POPRAWNE, program działa pięknie, gorzej jest, jeśli podamy ZŁE dane. Dokładniej, jeśli wpiszę wszystkie 3 liczby rzeczywiste, ładnie je wyświetla i informuje, czy dane zostały wczytane prawidłowo. Gdy np w drugim strumieniu wejściowym zamiast liczby rzeczywistej podam jakiś tekst, wtedy program tak jakby kończy swoje działanie. Nie zamyka się, ale już nie mogę wprowadzić trzeciej liczby/wartości, a cała reszta "głupieje", tzn źle informuje o tym, czy dane zostały poprawnie wczytane.
Mój kod wygląda następująco :
C/C++
#include <iostream>
using namespace std;
int main()
{
    float a, b, c;
   
    cout << "Wprowadz liczbe pierwsza: ";
    cin >> a;
    cout << "Wprowadz liczbe druga: ";
    cin >> b;
    cout << "Wprowadz liczbe trzecia: ";
    cin >> c;
   
    cout << "Liczba pierwsza to: " << a << " Wczytano? " << cin.good() << ".\n";
    cin.clear();
    cin.sync();
    cout << "Liczba druga to: " << b << " Wczytano? " << cin.good() << ".\n";
    cin.clear();
    cin.sync();
    cout << "Liczba trzecia to: " << c << " Wczytano? " << cin.good() << ".\n";
    cin.clear();
    cin.sync();
    return 0;
}
P-113398
Vister26
» 2014-07-06 21:48:11
Czyścisz bufor nie w tym miejscu co trzeba! Zastanów się czy użycie
cin.clear()
 ma sens w tym miejscu twojego kodu.
P-113399
Gaara
Temat założony przez niniejszego użytkownika
» 2014-07-06 22:00:04
Vister, mógłbyś mnie naprowadzić ? :)
Spróbowałem to trochę przerobić, w kursie pisze "przed każdym wczytaniem danych", a więc teraz spróbowałem tak :
C/C++
#include <iostream>
using namespace std;
int main()
{
    float a, b, c;
   
    cout << "Wprowadz liczbe pierwsza: ";
    cin >> a;
    cout << "Wprowadz liczbe druga: ";
    cin >> b;
    cout << "Wprowadz liczbe trzecia: ";
    cin >> c;
   
    cout << "Liczba pierwsza to: ";
    cin.clear();
    cin.sync();
    cout << a << " Wczytano? " << cin.good() << ".\n";
    cout << "Liczba druga to: ";
    cin.clear();
    cin.sync();
    cout << b << " Wczytano? " << cin.good() << ".\n";
    cout << "Liczba trzecia to: ";
    cin.clear();
    cin.sync();
    cout << c << " Wczytano? " << cin.good() << ".\n";
    return 0;
}

Niestety dalej nie jest dobrze :)
P-113400
Vister26
» 2014-07-06 22:19:46
Musisz użyć
cin.clear()
 bezpośrednio przed wczytaniem danych do zmiennej np.
std::cin >> a;
. Jeśli tego nie zrobisz to możesz zawiesić program jeśli wcześniej wpisałeś niepoprawne dane (tak jak napisałeś). Czyszczenie strumienia wejścia 3 razy pod koniec programu nie ma sensu ponieważ tam nie używasz
std::cin
, więc nie ma nic do czyszczenia. Natomiast, jeśli będziesz używał
cin.clear()
 po każdym wczytaniu to musisz najpierw zapisać wartość
cin.good()
 do jakiejś zmiennej (ponieważ
cin.good()
 zwraca wartość tylko z ostatniego wczytania, więc 2 pierwsze ci przepadną). Wytłumaczyłem może trochę zbyt chaotycznie ale to powinno wyjaśnić sprawę ;)
C/C++
#include <iostream>
using namespace std;
int main()
{
    float a, b, c;
    bool czydobrze1, czydobrze2; // jesli jeszcze nie wiesz o typie bool, mozesz uzyc int
   
    cout << "Wprowadz liczbe pierwsza: ";
    cin >> a;
    czydobrze1 = cin.good();
    cin.clear();
    cin.sync();
    cout << "Wprowadz liczbe druga: ";
    cin >> b;
    czydobrze2 = cin.good();
    cin.clear();
    cin.sync();
    cout << "Wprowadz liczbe trzecia: ";
    cin >> c;
   
    cout << "Liczba pierwsza to: " << a << " Wczytano? " << czydobrze1 << ".\n";
    cout << "Liczba druga to: " << b << " Wczytano? " << czydobrze2 << ".\n";
    cout << "Liczba trzecia to: " << c << " Wczytano? " << cin.good() << ".\n";
    return 0;
}
P-113401
pekfos
» 2014-07-06 22:40:39
Jeśli tego nie zrobisz to możesz zawiesić program jeśli wcześniej wpisałeś niepoprawne dane (tak jak napisałeś).
Myślał indyk o niedzieli.. ;) Tu program nie ma na czym się zawiesić, a i nie ma większego sensu, by zawieszanie programu przez błędny kod z std::cin przedkładać nad inne błędne i wieszające się kody.
P-113403
Vister26
» 2014-07-06 22:43:28
Może nie umiem tłumaczyć, ale mój kod działa raczej poprawnie. Przynajmniej na razie ;)
P-113404
Gaara
Temat założony przez niniejszego użytkownika
» 2014-07-06 23:03:40
Vister26, dzięki wielkie! ;)
Przejrzałem, wszystko rozumiem.
Teraz mogę spokojnie przejść do następnego tematu :)
P-113406
« 1 »
  Strona 1 z 1