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

Obsluga strumienia wejsciowego.

Ostatnio zmodyfikowano 2017-12-04 23:22
Autor Wiadomość
malpa121
Temat założony przez niniejszego użytkownika
Obsluga strumienia wejsciowego.
» 2017-12-04 18:14:16
Cześć, natknąłem się na podobny temat, ale on dotyczył czegoś innego niż mój problem. A mianowicie, rozwiązuje zadanie z kursu (http://cpp0x.pl/kursy/Kurs-C++/Poziom-1/Obsluga-strumienia-wejsciowego/12). Wszystko pięknie, ładnie tyle, że program nie wychwytuję błędu, gdy wpisuje nieprawidłowe wartości.
C/C++
#include <iostream>
int main()
{
    float a;
    int b;
    float c;
   
    std::cin >> a;
    std::cin.clear();
    std::cin.sync();
   
    std::cin >> b;
    std::cin.clear();
    std::cin.sync();
   
    std::cin >> c;
   
    std::cin.clear();
    std::cin.sync();
   
    std::cout << "liczbia pierwsza to: " << a << std::endl;
    std::cout << " wczytano? " << std::cin.good() << std::endl;
    std::cin.clear();
    std::cin.sync();
   
   
    std::cout << "liczba druga to: " << b << std::endl;
    std::cout << " wczytano? " << std::cin.good() << std::endl;
    std::cin.clear();
    std::cin.sync();
   
   
    std::cout << "liczba trzecia to: " << c << std::endl;
    std::cout << " wczytano? " << std::cin.good() << std::endl;
    std::cin.clear();
    std::cin.sync();
    return 0;
}
https://imgur.com/bpx0xAv
Bardzo proszę o pomoc bo za nic nie mogę dojść gdzie popełniam błąd. (wklejam link bo przez BBC mi nie wyswietla)
P-167528
RazzorFlame
» 2017-12-04 18:43:49
std::cout << " wczytano? " << std::cin.good() << std::endl;
Za każdym razem wyświetlasz tą samą wartość. Pomyśl co zrobiłeś:
Wczytałeś trzy razy jakąś liczbę.
Po każdym razie wyczyściłeś flagi błędu.
Następnie wyświetlasz po kolei liczby i 3x sprawdzasz czy cin.good.
Dostaniesz trzy te same wyniki bo sprawdzasz to pod koniec. Dodatkowo zawsze dostaniesz 1 (true) bo czyścisz flagi po wczytaniu każdej liczby.
Z mojego punktu widzenia postanowiłeś wstawiać std::cin.clear(), std::cin.sync() gdzie tylko popadnie.
Teraz jak to powinno wyglądać. Zawsze patrz na to pod względem pojedynczego wczytania: załóżmy, że chcesz wczytać jedną liczbę i sprawdzić czy poprawnie została wczytana. Na końcu czyścisz flagi, żeby poprawnie wczytać resztę danych:
C/C++
#include <limits> // dla std::numeric_limits

// ... w main

int myNum = 0;
std::cin >> myNum;
if( !std::cin.good() )
     std::cout << "Niestety, podales dane w zlym formacie." << std::endl;

std::cin.clear(); // czyszczenie flag
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
Tak to poprawnie powinno wyglądać. O ile pierwsze linijki są stosunkowo proste do zrozumienia, to ta ostatnia jest interesująca. Nie powinno się używać std::cin.sync(), gdyż nie służy ona do tego co chcemy osiągnąć (chociaż na systemach Windows prawdopodobnie będzie działać).
Ostatnia linijka mówi, że wszystkie poprzednio wczytane znaki do znaku nowej linii (stąd: '\n') mają zostać zignorowane.
Wczystkie, dlatego że std::numeric_limits<std::streamsize>::max() pobiera maksymalną liczbę znaków, które mogły zostać zapisane przy wczytaniu.
P-167531
malpa121
Temat założony przez niniejszego użytkownika
» 2017-12-04 23:22:39
zapewne to co podales jest pomocne, lecz wykorzystane sa mozliwosci ktorych jeszcze nie bylo w kursie. Wlasnie ostatni akapit kursu pominalem bo był, dla Linuksa.
P-167559
« 1 »
  Strona 1 z 1