Pytanie w sprawie iostream, c++ – Różnica między cin.ignore i cin.sync

9

Jaka jest różnica pomiędzycin.ignore icin.sync ?

Twoja odpowiedź

1   odpowiedź
14

cin.ignore odrzuca znaki, aż do określonej liczby lub do momentu osiągnięcia separatora (jeśli jest włączony). Jeśli wywołasz go bez argumentów, odrzuca jeden znak z bufora wejściowego.

Na przykład,cin.ignore (80, '\n') ignorowałby 80 znaków lub tyle, ile znajdzie, dopóki nie trafi w nową linię.

cin.sync odrzuca wszystkie nieprzeczytane znaki z bufora wejściowego. Jednak nie jest to gwarantowane w każdej implementacji. W związku z tym,ignore jest lepszym wyborem, jeśli chcesz spójności.

cin.sync() po prostu usunie to, co zostało. Jedyne zastosowanie, o którym mogę myślećsync() nie można tego zrobićignore jest zamiennikiemsystem ("PAUSE");:

cin.sync(); //discard unread characters (0 if none)
cin.get(); //wait for input

Zcin.ignore() icin.get(), to może być trochę mieszanki:

cin.ignore (std::numeric_limits<std::streamsize>::max(),'\n'); //wait for newline
//cin.get()

Jeśli pozostała nowa linia, po prostu stawiającignore będzie go pomijać. Jednak umieszczenie obu będzie czekać na dwa wejścia, jeśli nie ma nowej linii. Odrzucenie czegokolwiek, co nie jest czytane, rozwiązuje ten problem, ale znowu nie jest spójne.

ignore () należy wywołać przed cin lub po cin? Mówiąc konkretnie, czy po raz pierwszy, kiedy idę do cin, muszę opróżnić niechciane dane w buforze, jeśli w ogóle? A może zaprogramuje opróżnienie wszystkiego, gdy wprowadzona zostanie główna? Zauważyłem jednak, że jeśli wywołamy ignore (), to po raz pierwszy czeka on na jakiś inny znak spacji. Rajesh
@ 5fox: Mogę pokazać implementacje, w których nic nie robi:ideone.com/AR8lB Benjamin Lindley
@Rajesh, After. Bufor wejściowy nie powinien mieć losowych rzeczy podczas uruchamiania programu. Powszechnym przypadkiem użycia jest wyczyszczenie złego wejścia wprowadzonego przez użytkownika lub pozbycie się nowej linii pozostawionej przez operację wejściową. chris
Czy możesz mi pokazać konkretne implementacje, które cin.sync nie są bezpieczne! 5fox

Powiązane pytania