这是我的工作代码:
size_t FileReader::Read(ByteVector& output)
{
output.resize(m_elementSize * m_blockSize);
size_t read = fread(&output[0], m_elementSize, m_blockSize, m_file);
output.resize(read);
return read;
}
但是之前我曾尝试使用output.reserve(m_elementSize * m_blockSize);
据我所知,reserve
只是在内存中找到了容器。 resize
执行相同操作,还会将内存从垃圾箱更改为某些给定值并更改容器大小。
fread
第一个参数是void *
,它与unsigned char *
相同,我的问题是,为什么在调用fread
时出现异常。
为什么会这样?因为fread
采用void指针,并且不使用vector
类写入内存。
P.S。忘了提及typedef std::vector<unsigned char> ByteVector
答案 0 :(得分:4)
如果向量最初为空,则output[0]
将调用未定义的行为(无论您保留多少空间),并且在某些平台上它可能会抛出异常。
答案 1 :(得分:1)
找到了问题,现在我使用的代码叫做 working
我希望避免使用不必要的resize
,因为它适用于内存中的数据,但是在reserve
output[0]
不存在之后。
读取vector
后的大小将为零,resize
会破坏读取数据。