简体   繁体   中英

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

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.

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).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM