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


(Quentin) #1

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)

([alex]) #2

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


(Quentin) #3

No przecież tak mam... :frowning:

Jak dam:

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

to będzie to samo... "Zapętlywanie" w nieskończoność...


([alex]) #4

daj zwyczajnie:

cin.clear();


(Quentin) #5

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

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


([alex]) #6

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ł.


(Quentin) #7

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]



:?:

([alex]) #8

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ń.


(Quentin) #9

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 :?: