Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ how to check if a stream (iostream) is seekable

Tags:

c++

linux

seekg

Is there a way I can check if an istream of ostream is seekable?

I suspect doing a test seek and checking for failbit is not correct since the seek can fail for unrelated reasons.

I need this to work on Linux and mac, if that makes a difference.

like image 979
ATemp Avatar asked Feb 26 '12 06:02

ATemp


1 Answers

Iostreams doesn't give you much. Stream objects are just wrappers around a buffer object derived from class std::streambuf. (Assuming "narrow" characters.) The standard derived buffer classes are std::stringbuf for strings and std::filebuf for files. Supposing you're only interested in files, std::filebuf is just a simple wrapper around the C library functionality. The C library does not define a way to determine if a FILE object supports seeking or not, besides attempting to do so, so neither does C++.

For what it's worth, the semantics of seek vary a bit. Some platforms might allow you to "seek" a pipe but only to the current position, to determine how many characters have been read or written. Seeking past the end might resize the file, or might cause the next write operation to resize the file, or something in between.

You might also try checking errno if badbit is set (or, as I prefer, use exceptions instead of flags).

like image 155
Potatoswatter Avatar answered Nov 09 '22 19:11

Potatoswatter