Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取二进制文件时返回错误数据_C++_Io_Istream - Fatal编程技术网

C++ 读取二进制文件时返回错误数据

C++ 读取二进制文件时返回错误数据,c++,io,istream,C++,Io,Istream,我在读取yuv文件中的一些字节时遇到了问题(如果这很重要的话,它是1280x720),希望有人能指出我做错了什么。我使用read命令和istream迭代器得到了不同的结果。下面是一些我正在尝试做的示例代码: void readBlock(std::ifstream& yuvFile, YUVBlock& destBlock, YUVConfig& config, const unsigned int x, const unsigned int y, const bool

我在读取yuv文件中的一些字节时遇到了问题(如果这很重要的话,它是1280x720),希望有人能指出我做错了什么。我使用read命令和istream迭代器得到了不同的结果。下面是一些我正在尝试做的示例代码:

void readBlock(std::ifstream& yuvFile, YUVBlock& destBlock, YUVConfig& config, const unsigned int x, const unsigned int y, const bool useAligned = false)
{
    //Calculate luma offset
    unsigned int YOffset = (useAligned ? config.m_alignedYFileOffset : config.m_YFileOffset) +
    (destBlock.yY * (useAligned ? config.m_alignedYUVWidth : config.m_YUVWidth) + destBlock.yX);// *config.m_bitDepth;

//Copy Luma data
//yuvFile.seekg(YOffset, std::istream::beg);
    for (unsigned int lumaY = 0; lumaY < destBlock.m_YHeight && ((lumaY + destBlock.yY) < config.m_YUVHeight); ++lumaY)
    {
        yuvFile.seekg(YOffset + ((useAligned ? config.m_alignedYUVWidth : config.m_YUVWidth)/* * config.m_bitDepth*/) * (lumaY), std::istream::beg);
        int copySize = destBlock.m_YWidth;
        if (destBlock.yX + copySize > config.m_YUVWidth)
        {
            copySize = config.m_YUVWidth - destBlock.yX;
        }
        if (destBlock.yX >= 1088 && destBlock.yY >= 704)
        {
            char* test = new char[9];
            yuvFile.read(test, 9);

            delete[] test;
            yuvFile.seekg(YOffset + ((useAligned ? config.m_alignedYUVWidth : config.m_YUVWidth)/* * config.m_bitDepth*/) * (lumaY));
        }

        std::istream_iterator<uint8_t> start = std::istream_iterator<uint8_t>(yuvFile);
        std::copy_n(start, copySize, std::back_inserter(destBlock.m_yData));

    }
}
struct YUVBlock
{
std::vector<uint8_t> m_yData;
std::vector<uint8_t> m_uData;
std::vector<uint8_t> m_vData;
unsigned int m_YWidth;
unsigned int m_YHeight;
unsigned int m_UWidth;
unsigned int m_UHeight;
unsigned int m_VWidth;
unsigned int m_VHeight;

unsigned int yX;
unsigned int yY;
unsigned int uX;
unsigned int uY;
unsigned int vX;
unsigned int vY;
};
我的第一个字节是10。当我使用istream迭代器时:

std::istream_iterator<uint8_t> start = std::istream_iterator<uint8_t>(yuvFile);
    std::copy_n(start, copySize, std::back_inserter(destBlock.m_yData));
std::istream\u迭代器start=std::istream\u迭代器(yuvFile);
std::copy_n(开始、拷贝大小、std::back_插入器(destBlock.m_yData));
我读取的第一个字节是17。17是10之后的字节,因此istream迭代器似乎跳过了第一个字节


任何帮助都将不胜感激

istream::read
std::istream\u迭代器
之间有一个主要区别

std::istream::read
执行无格式读取。
std::istream\u迭代器执行格式化读取

std::istream\u迭代器
是一个单通输入迭代器,通过调用相应的
操作符>
从为其构造的
std::basic\u istream
对象中读取类型为
T
的连续对象

如果文件是使用
std::ostream::write
fwrite
创建的,则必须使用
std::istream::read
fread
读取数据


如果您的文件是使用创建格式化输出的任何方法创建的,例如
std::ostream::operato1。确保文件以
std::ios::binary
模式打开。2.使用
std::istreambuf\u迭代器
。我怀疑您的
10
被作为文本模式换行()跳过。啊,是的,您可能是对的。我可以;不过,我不能让我的istreambuf_迭代器接收我的istream。我应该能做到的,不是吗<代码>std::copy_n((std::istreambuf_迭代器(yuvFile)),copySize,std::back_插入器(destBlock.m_yData))
std::istream_iterator<uint8_t> start = std::istream_iterator<uint8_t>(yuvFile);
    std::copy_n(start, copySize, std::back_inserter(destBlock.m_yData));