繁体   English   中英

有没有比reinterpret_cast更好的选择 <char*> 从std :: istream阅读时?

[英]Is there a better option than reinterpret_cast<char*> when reading from std::istream?

我有以下代码:

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);
}

除了reinterpret_cast<char*>std::istream读取4个字节到uint32_t还有其他更好的方法吗? (显然不是c样式的强制转换)

我不认为那里,我也不认为你需要一个。 您要占用四个字节并重新解释它们; reinterpret_cast准确地描述了您的意图。

您可能希望将转换内容包装在模板阅读器函数中:

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();
}

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

您可以使用C样式强制转换,实际上是一样的,但是编写起来要短一些

is.read((char*)&next4Bytes, 4);

这个想法是read读取字节,与>>运算符相反,后者是一个高级构造。

您可以将字节读取为charunsigned char ,因为这就是字节的全部含义。 试图去解决这个几乎抵消的目的read这是要读取的字节。

因此,如果困扰您的是reinterpret_cast的详细信息,请使用模板。

如果困扰您的事实是您必须将字节读取为整数,请尝试首先将整数存储为字符串,然后使用适当的>>运算符将其提取。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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