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

Poziom 1 Rozdział 9

Ostatnio zmodyfikowano 2015-08-05 13:32
Autor Wiadomość
LEGOlas0232
Temat założony przez niniejszego użytkownika
Poziom 1 Rozdział 9
» 2015-08-02 22:39:45
Jak dotąd przechodziłem z łatwością przez poprzednie rozdziały, ale tutaj się trochę pogubiłem. Chodzi mi o podrozdział "Opis działania strumienia wyjściowego:

"Skoro nauczyliśmy się już korzystać ze strumienia wejściowego w podstawowym wymiarze - przyjrzyjmy się teraz jego działaniu. Wyobraźmy więc sobie, że początkowo strumień jest pusty. Wysyłamy następnie żądanie: "daj mi liczbę całkowitą" (czyli: std::cin>>liczba). Strumień jest pusty, więc nie można z niego pobrać danych, a więc użytkownik musi wprowadzić nowe dane do strumienia. Wprowadźmy teraz do strumienia następujące dane:

12345, 321. Czy 2+2 wynosi 4?

Po wciśnięciu klawisza ENTER dane te trafiają do bufora strumienia wejściowego, z którego następnie odczytywane są dane. Po wczytaniu liczby w buforze strumienia wejściowego zostaną następujące dane:

, 321. Czy 2+2 wynosi 4?

Co się teraz stanie, gdy zechcemy wczytać kolejną liczbę? Strumień stwierdzi, że pierwszym znakiem w strumieniu jest znak ,, który nie jest liczbą, a więc nie zostanie wczytana liczba. Operacja wczytywania się nie powiedzie, a flaga błędu zostanie ustawiona."

Moje podstawowe pytanie: jak sprawić by strumień był pusty???
Czy ktoś mógłby mi pokazać pełny kod do tego fragmentu?
P-135630
pekfos
» 2015-08-02 22:42:18
jak sprawić by strumień był pusty???
Na początku programu możesz założyć, że jest pusty. W pozostałych przypadkach, w kursie masz opisane czyszczenie strumienia - zarówno flag, jak i zawartości. To drugie nawet w dwóch wariantach.
P-135631
LEGOlas0232
Temat założony przez niniejszego użytkownika
» 2015-08-02 22:53:49
Ale jak to zrobić? Czego nie wpisywać? Jak mam założyć, że jest pusty?
P-135632
carlosmay
» 2015-08-02 23:15:14
C/C++
cin >> zmienna; // wklepujesz np zamiast liczby literę
// cin oczekiwał liczby wiec ustawia flagę bledu, ktora uniemożliwia dalsza prawidłowa prace z cin a w strumieniu została ta litera bo cin jej nie wczytal do zmiennej
cin.clear(); // czysci flagę  bledu i odblokowuje cin do ponownego użycia
cin.sync(); // opruznia strumień
Troche obrazkowo, ale mam nadzieję zrozumiale.

Edit: najlepiej nie zakładać że jest czysty tylko czyścić go gdy jest taki potrzebny.
P-135634
LEGOlas0232
Temat założony przez niniejszego użytkownika
» 2015-08-03 10:07:46
Dzięki. A czy mógłbyś mi też pokazać program do tego fragmentu kursu?

EDIT: Zrobiłem tak, ale chyba nie o to chodzi:


#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
float a;
long b;
cout <<"Podaj liczbe calkowita (nie wieksza niz 4 200 000 000) : ";
cin >> a;
cin.clear();
cin.sync();

cout <<"Podaj liczbe rzeczywista: ";
cin >> b;
cin.clear();
cin.sync();

cout <<"\nLiczba a = " << a << endl;
cout <<"\nLiczba b = " << b << endl;
return 0;
}
P-135638
carlosmay
» 2015-08-03 10:38:29
Zakładanie tematów: Kolorowanie składni.

Na logikę: czyść przed użyciem zmiennej.
Nawet  jak wyczyścisz pusty strumień nic mu się nie stanie.

C/C++
float a; // liczba rzeczywista
long b; // liczba calkowita
P-135640
C-Objective
» 2015-08-05 10:04:46
Odwalę troche pracy za ciebię:
C/C++
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
    float a;
    long b;
    cout << "Podaj liczbe calkowita (nie wieksza niz 4 200 000 000) : ";
    cin >> a;
    cin.clear();
    cin.sync();
    cout << "Podaj liczbe rzeczywista: ";
    cin >> b;
    cin.clear();
    cin.sync();
    cout << endl;
    cout << "Liczba a = " << a << endl;
    cout << "Liczba b = " << b << endl;
    return EXIT_SUCCESS;
}
Wystarczyła drobna korekta, a żeby uczynić program przenośnym na innych platformach (wątpię że chcesz to zrobić) można
zamienić
cout
 na
printf
.
P-135733
Szymon2727
» 2015-08-05 13:32:43
Objecitve nie mąć mu w głowie, zapomniałeś napisać że taki printf jest bardziej podatny na błędy i ma np. %d. Przestań już z tym promowaniem czystego C, bo nic dobrego z tego nie wyjdzie.

Co do tematu to po prostu przeczytaj ten kurs do końca, std::cin.clear() i std::cin.sync() to wszystko czego potrzebujesz do czystego strumienia.
P-135774
« 1 »
  Strona 1 z 1