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

Poprawne czyszczenie strumienia wejścia.

Ostatnio zmodyfikowano 2013-10-02 16:15
Autor Wiadomość
Lanc
Temat założony przez niniejszego użytkownika
Poprawne czyszczenie strumienia wejścia.
» 2013-10-01 23:34:39
Mam problem z czyszczeniem strumienia wejścia.Program ma na celu wprowadzić do tablicy 3 zmienne int,po uprzednim upewnieniu się,że są poprawne.
C/C++
#include <iostream>

using namespace std;

int wczytaj()
{
    int a[ 3 ];
    int i = 0;
    int b = 0;
    do
    {
        cin.sync();
        cin.clear();
       
        cin >> b;
       
        if( cin.good() )
        {
            a[ i ] = b;
            i++;
        }
       
    } while( i < 3 );
   
}

int main()
{
    wczytaj();
}



C/C++
#include <iostream>

using namespace std;

int wczytaj()
{
    int a[ 3 ];
    int i = 0;
    int b = 0;
    do
    {
       
        cin >> b;
       
        if( cin.good() )
        {
            a[ i ] = b;
            i++;
        }
        cin.sync();
        cin.clear();
    } while( i < 3 );
   
}

int main()
{
    wczytaj();
}

Te dwa kody blokują się po wpisaniu błędnych danych.
Działa kod poniżej,w którym zostało użyte czyszczenie dwukrotnie.Dlaczego?
C/C++
#include <iostream>

using namespace std;

int wczytaj()
{
    int a[ 3 ];
    int i = 0;
    int b = 0;
    do
    {
        cin.sync();
        cin.clear();
        cin >> b;
       
        if( cin.good() )
        {
            a[ i ] = b;
            i++;
        }
        cin.sync();
        cin.clear();
    } while( i < 3 );
   
}

int main()
{
    wczytaj();
}
P-93013
Monika90
» 2013-10-02 00:32:20
Wersja druga jest dobra, tylko clear musi być przed sync.

A poza tym zamiast sync używaj
C/C++
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );

Zapomniałeś też o instrukcji return w funkcji wczytaj.
P-93014
Lanc
Temat założony przez niniejszego użytkownika
» 2013-10-02 13:40:16
Ok, dziękuję za odpowiedź, ale nadal chciałbym się dowiedzieć dlaczego pierwszy sposób jest błędny? Czy jest to związane z funkcjonowaniem pętli? Oraz dlaczego musi być odpowiednią kolejność czyszczenia, skoro występuje niezależnie po sobie?
P-93016
Monika90
» 2013-10-02 14:50:29
Jeżeli strumień jest w stanie fail to sync nic nie robi, (tak jak i większość operacji na strumieniu). Dalatego najpierw musisz zmienić stan strumienia na good, np. za pomocą clear().

P-93018
Lanc
Temat założony przez niniejszego użytkownika
» 2013-10-02 16:15:40
Dziękuję za pomoc.Zamykam.
P-93021
« 1 »
  Strona 1 z 1