Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

checking data availability before calling std::getline

Tags:

c++

iostream

I would like to read some data from a stream I have using std::getline. Below a sample using the std::cin.

std::string line; std::getline( std::cin, line ); 

This is a blocking function i.e. if there is no data or line to read it blocks execution.

Do you know if exists a function for checking data availability before calling std::getline? I don't want to block.

How can I check whether the stream buffer is full of data valid for a successful call to std::getline?

Whatever looks like the code below

if( dataAvailableInStream() ) {      std::string line;      std::getline( std::cin, line ); } 
like image 797
Abruzzo Forte e Gentile Avatar asked Jul 23 '10 11:07

Abruzzo Forte e Gentile


People also ask

Does Getline ignore whitespace?

The getline() function in C++ is used to read a string or a line from the input stream. The getline() function does not ignore leading white space characters.

How does STD Getline work?

getline (string) in C++ The C++ getline() is a standard library function that is used to read a string or a line from an input stream. It is a part of the <string> header. The getline() function extracts characters from the input stream and appends it to the string object until the delimiting character is encountered.

Should I use getline or cin?

The main difference between getline and cin is that getline is a standard library function in the string header file while cin is an instance of istream class. In breif, getline is a function while cin is an object. Usually, the common practice is to use cin instead of getline.

Does Getline read EOF?

std::getline will read up to and including the final newline character and then return. It won't attempt to read beyond the end of the file. The EOF bit won't be set. If we are conditioned on eof() , we will start another iteration with nothing left to read.


2 Answers

There is no standard way to verify if getline will block. You can use:

std::cin.rdbuf()->in_avail() 

to see how many characters are definitely available before a read operation may block, but you would have to read the characters one by one before re-checking in_avail as there is no way to know in advance if any of the pending characters is a newline or the actual end of the stream. A getline call might block if this wasn't the case.

Note that although if in_avail() returns a postive number there are guaranteed that at least that many characters are available before the end of the stream, the converse is not true. If in_avail() returns zero there may still be characters available and the stream might not block immediately.

like image 73
CB Bailey Avatar answered Sep 21 '22 23:09

CB Bailey


The iostream library doesn't support the concept of non-blocking I/O. I don't think there's anything in the C++ standard that does. Any good solution would likely be platform-specific. If you can use the POSIX libraries, you might look into select. It's usually used for networking stuff, but it'll work just fine if you pass it the file descriptor for stdin.

like image 42
Michael Kristofik Avatar answered Sep 25 '22 23:09

Michael Kristofik