从std :: istream读取时,是否有比reinterpret_cast <char*>更好的选项?

Pat*_*ryk 0 c++ binaryfiles istream readfile

我有以下代码:

std::istream is;
// ... stream initialization ... 
while(is)
{
  uint32_t next4Bytes = 0;
  is.read(reinterpret_cast<char*>(&next4Bytes), 4);
  if(next4Bytes == 218893066)
  {
    is.seekg(-4, std::ios_base::cur);
    break;
  }
  else
    is.seekg(-3, std::ios_base::cur);
}
Run Code Online (Sandbox Code Playgroud)

有没有比reinterpret_cast<char*>从4个字节读std::istream入更好的方法uint32_t?(显然不是c式演员)

Dav*_*ler 7

我不认为有,我认为你不需要.你需要四个字节并重新解释它们; reinterpret_cast准确描述你的意图.


小智 5

您可能希望将该转换包装在模板化读取器函数中:

template<typename T>
std::streamsize read(T* out, std::istream& stream, size_t count=1) {
    stream.read(reinterpret_cast<char*>(out), sizeof(T)*count);
    return stream.gcount();
}
Run Code Online (Sandbox Code Playgroud)

如果您不关心读取数组,您甚至可以省略count参数并使其更简单.有一些方法可以根据自己的需要进行修改.如果您对实际读取的值有多少感兴趣而不是读取了多少字节,则可以将它除以sizeof(T),而不是只返回gcount.(这与fread的返回值的工作方式非常相似).或者如果不能读取所有数据,您可以抛出异常.