Sprawdzanie czy bufor klawiatury jest pusty

0

Robię kontrolę poprawności wprowadzanych danych.
Używam

cin.fail()

i cin.ignore

 do czyszczenia bufora.
Problem jest jednak jak oczekuję liczby, a podam np. 10sgasga, wtedy wczytuje mi tą 10, a reszta jest śmieciem, który trzeba tak, czy siak usuwać, bo później wrzuca mi się to kolejne czytanie.
Chciałbym zrobić tak, żeby sprawdzać czy bufor jest pusty. Wtedt jeśli 
```cpp
cin.fail()==true

i bufor niejest pusty, to znaczy, że źle podano dane, i trzeba prosić jeszcze raz. Jak to zrobić? Może jest jakaś lepsza opcja?
Próbowałem robić z kbhit(), ale nie sprawdza to się. Tak samo

cin.sync()

nie działa odpowiednio, muszę używać cin.ignore()

.
0

Po każdym użyciu operatora >> czyść bufor strumienia.
Nawet jeśli NIE MA tam śmieci, zostaje w nim '\n'.
Pozostawienie znaku przejścia do nowej linii w buforze strumienia powoduje
problemy w użyciu np. std::getline().
Na strumieniu trzeba działać świadomie.

0

czyszczę obecnie

cin.clear() 
 cin.ignore(100,'\n')

;
tak jest ok?

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

A tak jak mówię, da radę jakoś zrobić, czy np. oprócz podanej liczby zostało coś w buforze za nią, i wtedy żeby wyrzucić użytkownikowi, że podał nie liczbę tylko "liczbonapis" ?

0

Tak.

int number;
std::cin >> number; // wprowadzasz 10abc
char ch;
while (std::cin.get(ch) && ch != '/n'){
    std::cout << ch; 
} // wypisze pozostałe abc 

Pomijanie:

while (std::cin.get() != '/n')
    continue; 
0

Odnośnie tego błędu, to VS12 łyka:

#include "stdafx.h"
#include <iostream>
#include <limits>

int _tmain(int argc, _TCHAR* argv[]) {
	using namespace std;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');
	return 0;
}

Więc... Spróbuj skompilować najkrótszy kod z tym cin.ignore(...) i wklej go tutaj jeżeli ciągle będzie sprawiał problemy. Podejrzewam, że to coś innego. ;)

"Liczbonapis" czyli np. "42foo"?

    int i = 0;
    std::cin >> i;
    if (!std::cin) { // bad input! }
    // clean cin assumed here:
    if (std::cin.peek() != std::char_traits<char>::to_int_type('\n')) {
        std::string s;
        std::getline(std::cin, s);
        std::cout << "you typed \'" << s << "' after '" << i << "'\n";
    } else {
        std::cout << i << "\n";
    }

Ogółem - może zbieraj wszystko za pomocą std::getline i użyj stringstream'ów do walidacji?

1 użytkowników online, w tym zalogowanych: 0, gości: 1