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

[C++] Obsługa strumienia wejściowego a czyszczenie bufora

Ostatnio zmodyfikowano 2016-09-25 22:31
Autor Wiadomość
Szkaplerny
Temat założony przez niniejszego użytkownika
[C++] Obsługa strumienia wejściowego a czyszczenie bufora
» 2016-05-21 20:56:23
Hej,

dzisiaj zacząłem robić Wasz kurs i albo nie do końca rozumiem zagadnienie, albo 'coś nie działa' ;)

Link do samego zagadnienia: http://cpp0x.pl/kursy/Kurs-C++​/Poziom-1​/Obsluga-strumienia-wejscioweg​o​/12

Do meritum - w zadaniu domowym program ma dostać 3 liczby rzeczywiste, niezależnie czy są poprawnie wprowadzone przez użytkownika czy nie.
Przykładem jest:
[I] 13.3
[I] tak 123
[I] 33.22nie

[O] Liczba pierwsza to: 13.3. Wczytano? 1.
[O] Liczba druga to: 0. Wczytano? 0.
[O] Liczba trzecia to: 33.22. Wczytano? 1.

Jak rozumiem po każdym wczytaniu danych powinienem wyczyścić bufor.

Mój kod jest następujący:
C/C++
int main()
{
    float int1;
    float int2;
    float int3;
    int i = 0;
   
    cout << "Wpisz int1: ";
    cin >> int1;
    bool b1 = cin.good();
    cin.clear();
    cin.sync();
    cout << endl << ++i << endl << endl;
   
    cout << "Wpisz int2: ";
    cin >> int2;
    bool b2 = cin.good();
    cin.clear();
    cin.sync();
    cout << endl << ++i << endl << endl;
   
    cout << "Wpisz int3: ";
   
   
   
    cin >> int3;
    bool b3 = cin.good();
    cin.clear();
    cin.sync();
    cout << endl << ++i << endl << endl;
   
    cout << int1 << ' ' << int2 << ' ' << int3;
   
    cout << "\n";
    system( "pause" );
    return 0;
}

Jednak gdy wpiszę cokolwiek innego niż 3 liczby oddzielone spacją lub po kolei będę je wpisywać wyskakują błędy.
Efekt:
[I] 12 13a 44
[O] 12 13 -1.0(...)
Również wpisując przykładowe
'13.3
tak 123
33.22nie'
program nie działa tak jak zakładamy.
Ćwiczę na najnowszym VS.
P-148474
pekfos
» 2016-05-21 22:26:57
Zmienne muszą być zainicjalizowane, jeśli chcesz ich używać niezależnie od tego, czy udało się coś wczytać.
P-148475
ninja1234
» 2016-05-21 22:51:58
Zmienne boolowskie powinny być zdefiniowane na początku, następnie wypisane w strumieniem wyjściowym  cout.
P-148477
carlosmay
» 2016-05-22 00:22:01
Wystarczy zainicjalizować zmienne
C/C++
float int1 { }; // równoważne int1 = 0;
float int2 { };
float int3 { };
i przy nieudanej próbie wczytania program pokaże 0.

bool b1 = cin.good();
Definiujesz zmienne bool'owskie, ale ich nie używasz.

W najnowszym VS metoda sync() nie oczyszcza bufora strumienia.
Zamiast niej użyj ignore().
P-148481
Szkaplerny
Temat założony przez niniejszego użytkownika
» 2016-05-22 10:53:10
Rozumiem Panowie, tyle że zmienne boolowskie powstały do późniejszej pracy (których jeszcze nie chcę użyć), moim problemem są zmienne zmiennoprzecinkowe.

@carlosmay - o, o to mi dokładnie chodziło. Mam pytanie odnośnie samych nawiasów klamrowych - dotyczą inicjalizacji wszystkich typów czy są pewne ograniczenia?
Hm, dlaczego więc nie ma żadnej informacji o sync() przy kompilacji programu?
I czy przychodzą Ci na myśl jeszcze jakieś inne funkcje używane przez początkujących, które w VS mogłyby nie działać?

EDIT: Użycie funkcji ignore() nic nie pomogło. Jakieś inne rozwiązania?
P-148490
carlosmay
» 2016-05-22 13:57:20
Mam pytanie odnośnie samych nawiasów klamrowych - dotyczą inicjalizacji wszystkich typów czy są pewne ograniczenia?f
Od C++11 został wprowadzony ujednolicony sposób inicjalizacji.
Dotyczy on typów wbudowanych jak i typów definiowanych przez użytkownika (struct, class).

Hm, dlaczego więc nie ma żadnej informacji o sync() przy kompilacji programu?
Bo metoda sync() dla strumienia wejściowego nadal istnieje, ale nie do tego służy
(nigdy nie służyła, choć umiała to robić).
W innych środowiskach nadal działa, natomiast Microsoft zrezygnował z tej umiejętności.

Użycie funkcji ignore() nic nie pomogło.
Czy prawidłowo była użyta?
C/C++
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );

@edit:
I czy przychodzą Ci na myśl jeszcze jakieś inne funkcje używane przez początkujących, które w VS mogłyby nie działać?
To nie jest kwestia niedziałania funkcji w nowych środowiskach.
Zwykle funkcje przestarzałe są określane przez kompilator jako "deprecated" w logu kompilacji.
Jeśli działanie jakiejś funkcji nie zgadza się z założeniami, należy zerknąć dokumentacji danego kompilatora.
np. std::istream.sync
P-148494
Szkaplerny
Temat założony przez niniejszego użytkownika
» 2016-05-22 16:03:31
@carlosmay - nie, nie była prawidłowo zapisana ;) Umknęło mi to; dzięki wielkie za pomoc!
P-148499
Elaine
» 2016-05-22 19:42:32
W innych środowiskach nadal działa
W większości innych środowisk nigdy nie działała. To zachowanie to efekt uboczny pewnego zachowania niektórych wersji biblioteki standardowej C Microsoftu, nie występującego chyba nigdzie indziej.
P-148501
« 1 » 2
  Strona 1 z 2 Następna strona