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

时间:2016-01-27 09:49:43

标签: c++ binaryfiles readfile 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式演员)

4 个答案:

答案 0 :(得分:7)

我认为没有,我认为你不需要。你需要四个字节并重新解释它们; reinterpret_cast正好描述了你的意图。

答案 1 :(得分: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();
}

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

答案 2 :(得分:1)

您可以使用C风格的演员表,实际上相同但更短写

       <?php
            createimageinstantly();
            //$targetFolder = '/gw/media/uploads/processed/';
            //$targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;
            //$img3 = $targetPath.'img3.png';
            //print_r(getimagesize('http://www.vapor-rage.com/wp-content/uploads/2014/05/sample.jpg'));
            function createimageinstantly($img1='',$img2='',$img3=''){
                $x=$y=600;
                header('Content-Type: image/png');
                $targetFolder = '/gw/media/uploads/processed/';
                $targetPath = $_SERVER['DOCUMENT_ROOT'] . $targetFolder;

                $img1 = $targetPath.'img1.png';
                $img2 = $targetPath.'img2.png';
                $img3 = $targetPath.'img3.png';

                $outputImage = imagecreatetruecolor(600, 600);

                // set background to white
                $white = imagecolorallocate($outputImage, 255, 255, 255);
                imagefill($outputImage, 0, 0, $white);

                $first = imagecreatefrompng($img1);
                $second = imagecreatefrompng($img2);
                $third = imagecreatefrompng($img3);

                //imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
                imagecopyresized($outputImage,$first,0,0,0,0, $x, $y,$x,$y);
                imagecopyresized($outputImage,$second,0,0,0,0, $x, $y,$x,$y);
                imagecopyresized($outputImage,$third,200,200,0,0, 100, 100, 204, 148);

                imagepng($outputImage, $targetPath .round(microtime(true)).'.png');

                imagedestroy($outputImage);
            }
        ?>

答案 3 :(得分:0)

这个想法是read读取字节,而不是>>运算符,它是一个高级构造。

您将字节读取到charunsigned char,因为这是字节的全部内容。试图解决这个问题几乎取消了read读取字节的目的。

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

如果您需要将字节读入整数,那么首先尝试将整数存储为字符串,然后使用正确的>>运算符将其解压缩。