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

六眼飞鱼酱① 提交于 2019-12-14 01:36:50

问题


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.


回答1:


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



来源:https://stackoverflow.com/questions/9451005/c-how-to-check-if-a-stream-iostream-is-seekable

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!