[C++] Błędy strumienia pomimo ustawienia flagi ios::goodbit

Witam!

Mam taki program, który wczytuje parametry i zapisuje w zmiennych. 4-tym parametrem powinna być liczba. Aby wczytać ją do zmiennej z , posługuję się strumieniem istringstream. Jeżeli użytkownik wpisze tam tekst jako 4 parametr - wykona się instrukcja warunkowa:

sp.str(argv[3]);sp  z;    sp)

.clear(ios::goodbit); - czyści wszystkie flagi, zaś flagę ios::goodbit ustawia na true

No przecież tak mam… :frowning:

Jak dam:

cin.clear(cin.rdstate() | ~ios::failbit); [/code]

to będzie to samo… “Zapętlywanie” w nieskończoność…

daj zwyczajnie:

cin.clear();

:arrow: http://cplusplus.com/reference/iostream/ios/clear/

Przez domniemanie jest wtedy i tak ios::goodbit… Ktoś ma jakieś pomysły ? :frowning:

Nie zauważyłem tego ale brakuje ci po cin.clear() tego:

cin.ignore(INT_MAX,'\n'); [/code]

lub tego:

[code=php]while(cin.get()!=’\n’) {} 

Ponieważ jeżeli wpisałeś literki to cin.clear(); owszem przywoła cin “do porządku”, jednak w buforze zostaną te same literki, kolejny cin>>z znowu będzie je czytał.

03.06.2009

Ahaaa, dzięki wielkie. Myślałem, że to się wczyta jakoś do tej zmiennej typu int, co prawda rozwali się, ale się wczyta, no ale jednak nie…

EDIT: 23.02.2010

Sorry, że odkopuję temat sprzed ponad pół roku, ale chciałbym się dowiedzieć dlaczego wszyscy w ignore używają makra INT_MAX. Co ciekawe czasem zamiast 2147483647 może mieć wartość równą 32767 - czyli duuuużo mniejszą.

A tymczasem istnieje sobie klasa string, której obiekty mogą mieścić maksymalnie max_size() znaków (u mnie jest to wartość równa 4294967294 czyli o jeden mniej niż makra ULONG_MAX). I jeżeli ktoś skopiuje do konsoli tyle znaków (z jakiejś powiedzmy strony internetowej/dokumentu, bo trudno samemu tyle stukać w klawiaturę ^.^), które popłyną do strumienia cin, a który - tak się złożyło - płynie sobie do zmiennej typu “liczbowego” - np. short czy int to oczywiście strumień się zablokuje. Ale zignorujemy tylko INT_MAX znaków - u mnie to będzie np. ok. połowa z 4294967294 czyli max_size(). Reszta pozostanie.

Więc dlaczego zawsze w programach spotykam się z takim zapisem, zamiast np. z:

cin.ignore(string().max_size(), '\n');//czycin.ignore(ULONG_MAX, '\n');    //sposób szybszy bo bez tworzenia obiektu chwilowego i wywoływania funkcji [/code]



:?:

Najlepszy to właściwie: cin.sync();

W DOS’ie i Windowsach i tak żaden wiersz konsolowy nie może przekroczyć rozmiaru MAX_PATH, nie sprawdzałem jak w przypadku przekierowań.

Aha, dzięki będę używał już tego sync :wink:

To makro MAX_PATH jest zdefiniowane tylko w kompilatorach (preprocesorach raczej) Windowsowych bo nie mogę znaleźć opisu tego na cplusplus.com :?: