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

[Lekcja 15] cin.sync() vs cin.ignore(numeric_limits <streamsize>::max(), '\n')

Ostatnio zmodyfikowano 2013-08-15 00:43
Autor Wiadomość
Arnimarl
Temat założony przez niniejszego użytkownika
» 2013-08-14 21:43:03
W odpowiedzi na sugestie Pana pekfos- wycinek z terminala:

arnimarl@ubuntu:~/kodowanie$ make cpp
g++     cpp.cpp   -o cpp
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
1
---
1
Koniec
arnimarl@ubuntu:~/kodowanie$ ./cpp
Podaj liczbe:
2
---
mmm
Podaj liczbe:
---
1
Koniec
arnimarl@ubuntu:~/kodowanie$
P-90317
pekfos
» 2013-08-14 21:53:12
Tak myślałem.. ignore() blokuje program aż do napotkania znaku nowej linii, lub do odczytania 1000 znaków. Nie widzę prostego rozwiązania. Można utworzyć własny bufor strumienia, obsługujący sync().
P-90319
Monika90
» 2013-08-14 22:09:44
C/C++
int liczba;
cout << "Podaj liczbe: ";
while( !( cin >> liczba ) )
{
    cin.clear();
    cin.ignore( 99999, '\n' );
    cout << "To nie liczba, podaj liczbe: ";
}

cout << "Podano " << liczba << endl;
P-90320
MrPoxipol
» 2013-08-14 22:47:15
[Lekcja 17] wczytaj liczbę Mój post (P-85901).
C/C++
int liczba = 0;
bool czyOK = false;

do
{
    cin >> liczba; // Pobieramy liczbę.
    czyOK = cin.good(); // Zapisujemy do zmiennej 'czyOK' czy pobranie liczby się powiodło.
   
    if( !czyOK ) // Jeśli się nie powiodło
    {
        cout << "Wpisano błędną wartość!" << endl << "Podaj liczbe: "; // Wypisujemy komunikat.
        cin.clear(); // Czyścimy flagi błędów.
        #ifdef _WIN32           
        cin.sync(); // Czyścimy bufor(funkcja dla Windows), dla Linuksa jest podana niżej.
        #else
        cin.ignore( numeric_limits < streamsize >::max(), '\n' ); //dla użytkowników Linuksa (wymaga <limits>).
        #endif
    }
} while( !czyOK );

P-90321
Arnimarl
Temat założony przez niniejszego użytkownika
» 2013-08-14 23:21:48
Dziekuje wszystkim za zaangazowanie. Na podstawie zebranych sugestii stworzylem ponizszy fragment kodu, ktory wreszcie dziala w prawidlowy sposob:

C/C++
#include <iostream>
using namespace std;

int main()
{
    int liczba;
    bool test;
    do
    {
        cout << "Podaj liczbe:" << endl;
       
        cin >> liczba;
        test = cin.fail();
        cin.clear();
        cin.ignore( 1000, '\n' );
       
    }
    while( test );
   
    cout << "Podana liczbe: " << liczba << endl;
    cout << "Koniec" << endl;
    return 0;
}

Z jednej strony jestem zadowolony, gdyz ow wydawaloby sie blahy problem zostal wreszcie rozwiazany.
Z drugiej strony jestem bardzo zasmucony, gdyz pisanie nawet tak podstawowych programow sprawia komplikacje. Nie wiem, czy jest to wina mojego Linuksa, zlozonosci tego jezyka.. luk wzgledem roznicy przystosowania do obslugii OS Windows/Linuks.
Nie wiem, ale jest mi przykro i powiem szczerze, ze jestem troche zniechecony.
Od pol roku jestem amatorsko zainteresowany programowaniem i spedzam wlasciwie kazdy wolny czas na praktyce tworzenia kodu.
Jezyk w jakim cwiczylem sie do tej pory to glownie Python, a korzystalem przy tym z bardzo ciekawych zagranicznych projektow, takich jak: www.udacity.com czy www.codecademy.com. ktore bardzo polecam.
Oczywiscie, zeby mnie ktos zle nie zrozumial, te strone rowniez uwazam za swietna i wspaniale zorganizowana.
Jednak do czego zmierzam? Chcialem po prostu powiedziec, ze w porownaniu do jezyka Python, C++ znajduje jako bardzo ciezki i nieprzyjazny dla programistow, a przynajmniej tych poczatkujacych, za jakiego wciaz uwazam siebie. Zapewne jest to subiektywizm, jednak dzisiejszy problem przypomniel mi slowa kolegi, ktory odradzal mi proby nauki C++, a polecal doskonalenie sie w Python'ie, uzasadniajac to slowami: Moze i C++ jest potezny, moze szybki i dokladny, moze daje olbrzymie mozliwosci, ale to bez znaczenia, bo i tak bedziesz chodzil tam po nizinach. Jego rozbudowana skladnia sprawi, ze bedziesz godzinami pisal kod niskiego poziomu i niskiej wydajnosci. Czy nie lepiej chodzic po wyzynach? Dlatego radze, pozostan przy Python'ie.

Niestety, te slowa dzis sie sprawdzily w moim przypdku. Wiem, ze nie wolno sie poddawac, ale nigdy nie spedzilem niemal calego dnia na probach rozwiazania jednego problemu.
Na dzis dosc, bo jestem juz skolowacialy.

Na koniec chcialem jeszcze raz podziekowac za pomoc i jedynie poprosic o wytlumacznenie jak w koncu(najbardziej profesjonalnie), nalezy czyscic strumien w wypadku uzytkownikow Linuksa- takich jak ja.
P-90322
MrPoxipol
» 2013-08-14 23:26:30
Przecież masz napisane (patrz komentarze)...
P-90323
Arnimarl
Temat założony przez niniejszego użytkownika
» 2013-08-14 23:34:52
Wiem, ale dopiero sie oswajam z tym jezykiem, dlatego po prostu nie rozumiem ponizszego kodu i prosilbym o jego precyzyjne wytlumaczenie.
C/C++
cin.clear(); // Czyścimy flagi błędów.
#ifdef _WIN32          
cin.sync(); // Czyścimy bufor(funkcja dla Windows), dla Linuksa jest podana niżej.
#else
cin.ignore( numeric_limits < streamsize >::max(), '\n' ); //dla użytkowników Linuksa (wymaga <limits>).
#endif

Domyslam sie znaczenie powyzszego kodu, jednak wolalbym, aby nie byly to tylko domysly.
P-90324
MrPoxipol
» 2013-08-15 00:00:39
Definicje preprocesora zostały użyte tylko po to, aby kod był łatwy w przenoszeniu na inne platformy.
Równie dobrze, jeśli używasz Linuksa możesz napisać tylko tyle:
C/C++
cin.clear(); // Czyścimy flagi błędów.
cin.ignore( numeric_limits < streamsize >::max(), '\n' ); //dla użytkowników Linuksa (wymaga <limits>).
P-90325
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona