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-wejsciowego/12Do 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: 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. |
|
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ć. |
|
ninja1234 |
» 2016-05-21 22:51:58 Zmienne boolowskie powinny być zdefiniowane na początku, następnie wypisane w strumieniem wyjściowym cout. |
|
carlosmay |
» 2016-05-22 00:22:01 Wystarczy zainicjalizować zmienne float int1 { }; float int2 { }; float int3 { };
i przy nieudanej próbie wczytania program pokaże 0. Definiujesz zmienne bool'owskie, ale ich nie używasz. W najnowszym VS metoda sync() nie oczyszcza bufora strumienia. Zamiast niej użyj ignore(). |
|
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? |
|
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? 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 |
|
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! |
|
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. |
|
« 1 » 2 |