Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Better way to determine length of a std::istream?

Tags:

c++

stream

std

Is there a better way to determine the length of an std::istream than the following:

std::istream* pcStream = GetSomeStream();
pcStream->seekg(0, ios::end);
unsigned int uiLength = pcStream->tellg();

It just seems really wasteful to have to seek to the end of the stream and then seek back to the original position, especially if the stream might be to a file on some slow media like a CD or DVD.

like image 510
FlintZA Avatar asked Oct 27 '09 14:10

FlintZA


1 Answers

The "best" way is to avoid needing the length :)

  • Not all streams are seekable (For example, imagine an istream on a network socket)
  • The return type from tellg() is not necessarily numeric (the only requirement is that it can be passed back to seekg() to return to the same position)
  • Even if it is numeric, it is not necessarily a number of bytes. For example, it could be a "magic" value meaning "at the end"
  • For fstreams, issues like case and linefeed conversion can screw things up
like image 125
Éric Malenfant Avatar answered Oct 01 '22 04:10

Éric Malenfant