Czyszczenie strumienia wejsciowego

Czyszczenie strumienia wejsciowego
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

Ogolnie to powiem wam ze nie zabardzo rozumiem dzialanie tego:

Kopiuj

std::cin.clear();
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );

mam opis:
"Powyższy zapis ignoruje do 1000 znaków znajdujących się w strumieniu wejściowym. Jeżeli w strumieniu wejściowym zostanie napotkany znak nowego wiersza '\n' proces ignorowania znaków zostanie zakończony. Proces ignorowania znaków nie zostanie jednak zakończony gdy w buforze nie będzie więcej znaków do odczytania. Jeżeli chcesz używać tej techniki to należy czyścić strumień wejściowy po każdym wczytaniu danych by uniknąć ewentualnych problemów technicznych związanych ze sposobem działania tej metody."
No i opis tego ze to pierwsze czysci flagi bledu a drugie bufor tzn ignoruje znaki w nim.

Ale mimo wszystko nie zabardzo rozumiem, czyli jak to jest podaje pierwsza liczbe normalnie, w drugiej powiedzmy podaje znak *, i on teraz znajduje sie w buforze wejsciowym ale jest ignorowany przez druga linijke tak ? On znika w ktoryms momencie ? i to cale , 'n/' na koncu linijki, jest opisane ze beda znaki ignorowane pÓÓÓÓki to sie tam nie pojawi, i faktycznie wpisuje to w dzialajacym programie i crashuje go z powodu wczesniej wpisanych znakow, ale gdy tego nie podam to program dziala w nieskonczonosc... a wiec jak dokladnie dziala i co robi to '\n' na koncu tego wiersza ? Ogolnie prosilbym o lopatologicznie wytlumaczenie tych dwoch linijek bo nie moge troche tego ogarnac.

edytowany 1x, ostatnio: Shalom
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
4

Chyba niewiele rozumiesz. Podajesz jakieś dane do bufora. Jeśli próbujesz czytać z bufora strumieniami bo sprawdzany jest typ czytanych danych. Jeśli próbujesz czytać inta a ktoś podał na wejście coś innego niż liczbę, to strumień ustawi się w stanie błędu i odmówi czytania. Od teraz każda próba czytania tym strumieniem zakończy sie błędem.
cin.clear powoduje usunięcie flagi błędu i strumień znów jest użyteczny. Ale w buforze wejściowym nadal jest ta nie-liczba i próba odczytania inta znów spowoduje błąd. Jeśli jesteś pewien że czytasz liczby to możesz postanowić skasować nie-liczbowy input użytkownika.
cin.ignore powoduje usunięcie z bufora N znaków, ewentualnie aż do napotkania jakiegoś konkretnego symbolu.
\n to znak nowej linii. Jak wpisujesz liczby i zatwierdzasz je "enterem" to dodawana jest automatycznie nowa linia (bo przecież enter powoduje że coś ci przeskakuje "linijkę niżej").


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
PR
  • Rejestracja:około 11 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Pomorskie (Stare Kabaty)
0

Temat jest prosty..
Grzyby i porosty :D
Nie, ale tak serio, to temat wcale nie jest taki prosty, i na twoim poziomie wtajemniczenia nie musisz dokładnie wiedzieć co robi cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );, bo po prostu nie jest Ci to raczej potrzebne, jest to prawdopodobnie(niech ktoś to potwierdzi) niezawodny(przenośny) sposób wczytywania danych, bo poleca go sam twórca języka w tym linku źródło.
Natomiast literał \n jest wpisywany do bufora gdy wciśniesz enter.

edytowany 1x, ostatnio: Proxima
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

Okej wszystko rozumiem oprocz tego '\n'
No bo powiedzmy ze podaje znak zamiast liczby, zeby program dalej mogl dzialac, te linie usuwaja flage bledu i "usuwaja" znak z bufora, dochodze do nastepnego cin >> - i tutaj wpisuje juz normalnie liczbe i zatwierdzam ja enterem, czy to nie powinno znowu "powrocic" znaku do bufora ?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

Nie, bo domyślnie ustawiony jest tryb pomijania białych znaków jak czytasz . Przykład: w kodzie masz

Kopiuj
int x,y,z;
cin>>x>>y>>z;

W konsoli wpisujesz 1 2 3 czyli pomiędzy liczbami są spacje / białe znaki a mimo to strumień te inty wczytuje a białe znaki pomija. Patrz np. na taki kod:

Kopiuj
#include <iostream>
using namespace std;

int main() {
	char c = 'x';
	cin>>noskipws>>c;
	cout<<int(c);
	return 0;
}

Jeśli po prostu stukniesz enter na klawiaturze to program wypisze 10 bo \n ma numer 10 w ASCII. Gdyby w kodzie nie było noskipws to stuknięcie entera nic by nie dało i program nadal czekałby na dane.
Więc jak widzsz strumień czasem wyciąga białe znaki i pomija a czasem nie.
Podanie \n jako delimitera zakłada że użytkownik mógł źle wpisać jedną linijkę danych a kolejne juz poprawnie. Zamiast tego mógłbyś tam mieć EOF i wtedy ignore skasowałby wszystko co jest na wejściu. Byłoby to o tyle niewygodne ze często pętli się program do czasu kiedy na wejściu nie będzie EOFa (czyli dopóki program ma jeszcze dane do czytania). Taki ignore automatycznie skończyłby program.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
twonek
czemu nagle strzałki zmieniły kierunek przy yz ;)
Shalom
Przyzwyczajenie :D rzadko korzystam z cin&gt;&gt; :P
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

nie rozumiem :(

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
2

to zostaw to w spokoju idz do czegoś prostszego. Zrozumienie przyjdzie z czasem.

US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

Kurcze ale chce zrozumiec bo potem znowu dojde do dalszej czesci kursu i stane w miejscu ;c
@Edit
Moze zrozumialem, opisze jak ja to rozumiem a jesli zle to poprawcie... A wiec:
w momencie jak wpisuje znak i zatwierdzam to enterem to cin.ignore usuwa to co wpisalem przed tym jak nacisnalem enter a po tym jak zatwierdzilem ten znak ktory wpisalem enterem, konczy ignorowanie kolejnych znakow i pozwala mi wpisac przy nastepnym cin >> cos innego, tak ?

edytowany 1x, ostatnio: _user
twonek
ja z kolei za cholerę nie potrafię zrozumieć Twojego zdania :D
US
no nie wiem, opisalem najlepiej jak moglem chyba, chodzi o to ze np, mam cin >> x; wpisuje tego cina, tylko ze wpisuje znaki, i ignore ignoruje te znaki ale przestaje ignorowac znaki po tym jak nacisne enter, cos takiego ?
PR
ignore usuwa wszystkie znaki (w tym błędne, czyli niezgodne z wczytywanym typem) do momentu napotkania znaku '\n' o którym możesz myśleć jak o enterze po prostu więcej nie jest Ci na razie do szczęscia potrzebne, srsly :P
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

pozwole sobie na maly refresh i pytanie:

  • w ktorym momencie ta linia ignore spotyka ten \n ? i co sie wtedy dzieje ze znakami w buforze
LA
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 9 lat
  • Lokalizacja:Biłgoraj
  • Postów:54
1

Zostaw to na razie w spokoju.
Naprawdę, jeśli jeszcze tego nie rozumiesz, to nie ma nic w tym dziwnego.
A na pewno z tego powodu nie nie poradzisz sobie z kursem. //ale zabawne to podwójne zaprzeczenie wyszło ;p


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Pozdro, Lauro.
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

tak, zgrywus z ciebie ;d

edytowany 1x, ostatnio: _user
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

ej cin.ignore na pewno usuwa tez prawidlowo podane liczby ? skoro usuwa tez prawidlowo podane liczby to czemu potem dobrze mi je zwraca ?
Autor kursu napisal ze tylko w podaniu blednych znakow bedzie mozna zobaczyc dzialanie tego cin.ignore a wiec jak to mozliwe ze prawidlowe liczby tez usuwa ?

edytowany 2x, ostatnio: _user
PR
  • Rejestracja:około 11 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Pomorskie (Stare Kabaty)
0

Gościu, odpuść sobie to cin.ignore, naprawde.
Więcej sie nauczysz przerabiając dalej kurs niż zastanawiając sie nad tym co jest Ci na razie ABSOLUTNIE niepotrzebne do szczęścia, potrafisz dobrze wczytać dane - i super, nie dociekaj bo zmarnujesz czas.

edytowany 2x, ostatnio: Proxima
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

dobra ale powiedz jeszcze jak to ignore usuwa tez liczby skoro wczytuje je mi potem normalnie ?

PR
@Shalom udzielił Ci dokładnie odpowiedzi na to pytanie. Przeczytaj kilka razy jego post, najlepiej ze zrozumieniem. poza tym TO NIE JEST ISTOTNE, liczby pobierane są poprawnie i tyle.
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

jest istotne bo napisalem taki program

Kopiuj
#include <iostream>
#include <limits>
using namespace std;

int wczytajLiczbe()
{
  int liczba = 0;
  do
  {
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
      cin >> liczba;
  }while (!std::cin.good());
}
int main()
{
  std::cout << "Podaj liczbe: ";
  int liczba1 = wczytajLiczbe();
  std::cout << "Podales liczbe: " << liczba1 << std::endl;
  return 0;
}

i liczba1 ciagle zwraca mi 0 bez roznicy co wpisze i nie wiem czemu ;c
i co zrobic zeby cin pytal o liczbe dopuki podajemy zle znaki ?

edytowany 2x, ostatnio: _user
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Pokaż mi gdzie zwracasz z tej funkcji jakąś wartość. I dare you.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
US
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 10 lat
  • Postów:172
0

Dobra skonczylem xd oficjalny kod wyglada tak:

Kopiuj
 1#include <iostream>
 2#include <limits>
 3using namespace std;
 4
 5int wczytajLiczbe()
 6{
 7  int liczba = 0;
 8  do
 9  {
10    std::cin.clear();
11    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
12    cout << "Podaj prawidlowa liczbe: ";
13    cin >> liczba;
14  }while(!(cin.good()));
15  return liczba;
16}
17int main()
18{
19  cout << "Podaj liczbe: ";
20  int liczba1 = wczytajLiczbe();
21  std::cout << "Podales liczbe: " << liczba1 << std::endl;
22  return 0;
23}

troche dluzylem temtat ale naprawde chcialem go zrozumiec, mysle ze moge juz kroczyc dalej, dzieki wam :)

edytowany 1x, ostatnio: _user
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)