Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

std::cin.readsome always reading 0 bytes

Tags:

c++

iostream

I did a simple test with C++ code and using the helper tool pv(pipe viewer). The code is:

#include <iostream>
#include <array>

int main() {
    std::array<char,4096> buffer;
    while( true ) {
        std::cin.readsome(buffer.data(),4096);
    }
}

I execute with:

pv /dev/urandom | ./a.out

Through pv, I notice that readsome never reads anything. What am I missing?

like image 483
André Puel Avatar asked Jul 11 '14 14:07

André Puel


1 Answers

Please see cppreference, especially under "Notes".

The behavior of this function is highly implementation-specific. For example, when used with std::ifstream, some library implementations fill the underlying filebuf with data as soon as the file is opened (and readsome() on such implementations reads data, potentially, but not necessarily, the entire file), while other implementations only read from file when an actual input operation is requested (and readsome() issued after file opening never extracts any characters). Likewise, a call to std::cin.readsome() may return all pending unprocessed console input, or may always return zero and extract no characters.

However, if I try this with:

std::cin >> buffer.data();

Then I can extract the console input. In order to get the behavior you are seeking, I would use std::istream::get(), and check the eof and fail bits in your while loop.

like image 143
kwierman Avatar answered Sep 17 '22 09:09

kwierman