Sprawdzenie zawartości bufora strumienia wejściowego

0

Witam. Czy istnieje możliwość sprawdzenia zawartości bufora strumienia wejściowego w C++? Wiem że metodą cin.ignore(n,delim) możemy wyrzucić z bufora n znaków lub do napotkania znaku delim. Szukam jednak metody która sprawdzałaby czy w buforze coś jest. W razie jakby coś było to mogłaby ewentualnie to odczytać i wstawić do zmiennej, chodzi mi o coś w rodzaju zwykłego cin<<x; tylko żeby nie wymuszał on w konsoli napisania czegoś w przypadku gdy bufor byłby pusty.

Chodzi mi docelowo o to by wykorzystać by stworzyć możliwość odczytania z jednej linijki różnej ilości argumentów oddzielonych spacją . Dotychczas uzyskałem taki efekt poprzez odczytanie całej linii getlinem i rozdzielenie z niej poszczególnych danych poprzez szereg operacji na łańcuchach.

0

O to chodzi?

    auto skip_ws = [](std::istream &is) -> bool {
        char ch = 0;
        while(ch != '\n' && is && isspace(ch = is.peek())) { is.get(); }
        return ch != '\n';
    };
       
    int v; 
    
    while(std::cin) {
        while(skip_ws(std::cin) && std::cin >> v) {
            std::cout << v << ' ';
        }
        
        std::cout << '\n';
    }
0

Mam problem teraz z kompilacją powyższego programu na windowsie gdzie go potrzebuje. Błędy sugerują że uruchamia się na starym standardzie poniżej C++11. Mam tutaj IDE na GCC 4.8.1, który wspiera C++11, tylko że nie bierze go domyślnie i nie wiem jak to zmienić. Potrzebuje czegoś analogicznego do parametru -std=c++11 dla g++ na linuxie (tam działa).

PS. Liczyłem że okaże się że istnieje jakaś funkcja w stylu cin.isEmpty()..

0
Erwin14 napisał(a):

Chodzi mi docelowo o to by wykorzystać by stworzyć możliwość odczytania z jednej linijki różnej ilości argumentów oddzielonych spacją . Dotychczas uzyskałem taki efekt poprzez odczytanie całej linii getlinem i rozdzielenie z niej poszczególnych danych poprzez szereg operacji na łańcuchach.

STL jest pod tym względem kulawe, ale da się to zrobić:

std::vector<double> readDoubles(std::istream& input)
{
     std::vector<double> result;
     double x;
     while(input >> x) result.push_back(x);
     return result;
}

std::vector<std::vector<double>> readDoubleMatrix(std::istream& input)
{
    std::vector<std::vector<double>> result;
    std::string line;
    while(std::getline(input, line)) {
        std::istringstream lineData{ line }; 
        result.push_back(readDoubles(lineData));
    }
     return result;
}
0

PS. Liczyłem że okaże się że istnieje jakaś funkcja w stylu cin.isEmpty()..

Jest taka funkcja - std::istream::eof :)

0

Dziękuję za odpowiedzi. A co do użycia C++11 na Windows to tutaj flagi dla kompilatora dodaje się poprzez ich zaznaczenie w opcjach. Dla Code::Blocksa to będzie Settings->Compiler->CompilerFlags i zaznaczamy interesujące nas [-std=c++11].

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