Jak wyczyścić bufor cin w C ++?
Jak wyczyścić bufor cin w C ++?
Odpowiedzi:
Możliwie:
std::cin.ignore(INT_MAX);
To by przeczytało i zignorowało wszystko do EOF
. (możesz również podać drugi argument, który jest znakiem do odczytania do (np: '\n'
aby zignorować pojedynczą linię).
Ponadto: prawdopodobnie chcesz również wykonać: std::cin.clear();
przed tym, aby zresetować stan strumienia.
Wolałbym ograniczenia rozmiaru C ++ od wersji C:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin
i użyję pierwszej instrukcji powyżej do opróżnienia cin
bufora, to wyświetla monit o wprowadzenie danych, dopóki nie wejdę EOF
, naciskając ctrl+d
?
cin.clear();
fflush(stdin);
To była jedyna rzecz, która zadziałała podczas czytania z konsoli. W każdym innym przypadku albo czytałby w nieskończoność z powodu braku \ n, albo coś pozostawało w buforze.
EDYCJA: Dowiedziałem się, że poprzednie rozwiązanie pogorszyło sprawę. TEN jednak działa:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
Znalazłem dwa rozwiązania tego problemu.
Pierwszym i najprostszym jest użycie std::getline()
na przykład:
std::getline(std::cin, yourString);
... to odrzuci strumień wejściowy, gdy dotrze do nowej linii. Przeczytaj więcej o tej funkcji tutaj .
Inną opcją, która bezpośrednio odrzuca strumień, jest to ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Powodzenia!
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
Co powiesz na:
cin.ignore(cin.rdbuf()->in_avail());
Wolę:
cin.clear();
fflush(stdin);
Jest przykład, w którym cin.ignore po prostu tego nie robi, ale w tej chwili nie mogę o tym myśleć. To było jakiś czas temu, kiedy musiałem go użyć (z Mingw).
Jednak fflush (stdin) jest niezdefiniowanym zachowaniem zgodnie ze standardem. fflush () jest przeznaczona tylko dla strumieni wyjściowych. fflush (stdin) tylko wydaje się działać zgodnie z oczekiwaniami na Windows (z GCC i MS kompilatory przynajmniej) jako rozszerzenie standardu C .
Jeśli więc go użyjesz, Twój kod nie będzie przenośny.
Zobacz Używanie fflush (stdin) .
Zobacz także http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1, aby znaleźć alternatywę.
Innym możliwym (ręcznym) rozwiązaniem jest
cin.clear();
while (cin.get() != '\n')
{
continue;
}
Nie mogę użyć fflush ani cin.flush () z CLion, więc to się przydało.
Najprostszy sposób:
cin.seekg(0,ios::end);
cin.clear();
Po prostu umieszcza wskaźnik cin na końcu strumienia stdin, a cin.clear () czyści wszystkie flagi błędów, takie jak flaga EOF.
Powinno działać:
cin.flush();
W niektórych systemach nie jest dostępny, a następnie możesz użyć:
cin.ignore(INT_MAX);
flush
metoda służy tylko do wyświetlania i dotyczy już zapisanych znaków.
basic_istream<char>' has no member named 'flush'
cin.get()
wydaje się, że spłukuje go automatycznie, dość dziwnie (chociaż prawdopodobnie nie jest to preferowane, ponieważ jest to mylące i prawdopodobnie temperamentne).
U mnie to zadziałało. Użyłem pętli for z getline ().
cin.ignore()