Funkcja clear() i rdstate() jako jej argument
Ostatnio zmodyfikowano 2017-03-08 22:33
Lich555 Temat założony przez niniejszego użytkownika |
Funkcja clear() i rdstate() jako jej argument » 2017-03-08 19:42:18 Witam. Wczytałem strumieniem do tablicy wszystko co miałem wczytać, ustawiła się flaga eofbit. Chcę wrócić na początek tablicy i przeczytac cos jeszcze raz. Żeby to zrobić muszę skasować tą flagę błędu. Mam taką linijkę: potok.clear( potok.rdstate() & ~ios::eofbit );
rdstate zwraca aktualny stan flagi błędu. Nie rozumiem co robi znak & tutaj oraz znak ~ przed ios::eofbit. Chcemy to znisczyć i odnosi się to do destruktora? :P |
|
1aam2am1 |
» 2017-03-08 20:09:08 Nie wiem o co pytasz ale: jeżeli mamy zmienną np char a; a = 0b00000101;
W a teraz mamy binarnie ustawione dwie flagi na 1 i 3 miejscu. Jest to liczba 5;
a = ~a;
teraz w a mamy odwrotność 0b11111010. Jedynki zamieniły się na zera i odwrotnie.
no a teraz odpowiedź co robi pojedyncza & a = 0b110 & 0b011
a będzie zawierało liczbę 0b010 gdyż & jest to "and" binarny to i to
Więc twój zapis odwraca flage błędu i robi and z bitmaską. Zerując tylko pojedynczą flagę.
PS. Czemu po prostu nie użyjesz potok.clear(); |
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2017-03-08 20:21:50 Tak było w przykładzie. Pewnie dlatego, że jeśli bym użył potok.clear() to usunąłbym wszystkie flagi błędu, a tak to usuwam tylko tą co chcę usunąć. Tak? :D Po co odwracać bity w tej fladze? |
|
1aam2am1 |
» 2017-03-08 20:52:15 Odwracamy bity by zrobić and ze wszystkimi zwróconymi flagami Np 00001 - to nasza flaga
01101 - to name zwróciło 11110 - odwrócona flaga & - przeprowadzenie operacji 01100 - wynik. Jak widać nasza flaga została usunięta. |
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2017-03-08 21:04:27 Ok. Powiedz mi czy dobrze to rozumiem. Flagę wyzerujemy jak będzie miała zera tam gdzie teraz ma jedynki. Czyli jak mamy 0001 to musimy zrobić żeby na ostatnim bicie nie było 1. Gdybyśmy użyli and to by zwróciło 1 na końcu. A gdy użyjemy and na odwróconej fladze to zwróci nam 0? Ta bitmaska o której mówisz to jest to rdstate()? |
|
1aam2am1 |
» 2017-03-08 22:33:08 Tak, chodzi oto że operacja & działa na każdym bicie osobno tak że 0 & 0 = 0 1 & 0 = 0 0 & 1 = 0 1 & 1 = 1 Nas interesują dwie ostatnie linijki Jeżeli pierwsza kolumna to pojedyncze bity z bitmapy To jak zrobimy nasza operacje otrzymamy to samo co było przedtem. Natomiast jeżeli zrobimy to z 0 (2 pierwsze linijki) to otrzymamy 0. Więc jak w poprzednim poście mówiłem gdy odwrócony bity naszej flagi i zrobimy operacje & to otrzymamy wszędzie to co było a w miejscu bity flagi 0. Flaga zostanie wyzerowana. |
|
« 1 » |