Лучший способ определить длину std:: istream?

есть ли лучший способ определить длину std::istream, чем следующее:

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

это просто кажется очень расточительным, чтобы искать до конца потока, а затем искать обратно в исходное положение, особенно если поток может быть в файл на некоторых медленных носителях, таких как CD или DVD.

3 ответов


"лучший" способ-избежать необходимости в длине:)

  • не все потоки доступны для поиска (например, представьте istream в сетевом сокете)
  • тип возврата из tellg () не обязательно является числовым (единственное требование заключается в том, что он может быть передан обратно в seekg (), чтобы вернуться в ту же позицию)
  • даже если он числовой, это не обязательно количество байтов. Например, это может быть "магическое" значение, означающее "В конце"
  • для fstreams, такие проблемы, как преобразование case и linefeed, могут испортить все

вы рассматривали возможность отслеживания размера с помощью istream:: gcount() ?


был какой-то поток, который не мог получить длину, вызвав tellg(). В случае, tellg() может возвратить -1.

вы можете получить длину потока, подготовив буфер достаточного размера. Я узнал, как получить длину, заглянув в