【问题标题】:Read N bytes from file and append them to a std::vector从文件中读取 N 个字节并将它们附加到 std::vector
【发布时间】:2011-09-09 09:24:11
【问题描述】:

我想从文件流中读取 N 字节的数据并将它们附加到向量中。所以假设我们有一个

basic_ifstream<uint8_t> myFileStream;

还有一个

vector<uint8_t> myBuffer;

目前我正在做这样的事情:

myBuffer.reserve(N);
for (int i=0; i<N; ++i)
{
    uint8_t tmpByte;
    myFileStream.read(&tmpByte, 1);
    myBuffer.push_back(tmpByte);
}

但这非常慢。

现在我尝试让myFileStream.read 直接将数据复制到向量中。由于向量将其元素存储在一个连续的存储位置,我认为这样的事情应该是可能的:

uint8_t* ptr = &myBuffer.back(); // there is already some elements in the buffer (I know)
ptr++; // first element after existing data
myBuffer.resize(myBuffer.size() + N);
myFileStream.read(ptr, N);

但是这样我得到一个运行时错误(堆损坏)。这个解决方案有什么问题?还是有更好的方法来做到这一点?

【问题讨论】:

    标签: c++ stl vector filestream


    【解决方案1】:

    您的问题是resize 可能需要重新分配整个向量,从而使您之前的@​​987654322@ 无效。只需在resize 之后取指针。

    std::size_t oldSize = myBuffer.size();
    // resize first
    myBuffer.resize(oldSize + N);
    uint8_t* ptr = &myBuffer[oldSize]; // already first element after existing data
    myFileStream.read(ptr, N);
    

    请注意,即使原始向量为空(当然,对于 N != 0),此实现也会起作用。

    【讨论】:

    • @Ajeet: reserve() 不会改变容器的size()。我重视正确性而不是性能。
    • 是的。只有当他使用 push_back() 时它才会有用。删除我的评论。谢谢@R。马蒂尼奥
    • 一个警告:如果read 最终读取的字节数少于 N 字节,则您需要将大小调整为该计数。您可以使用gcount() 来获取读取的字节数。
    猜你喜欢
    • 2018-11-02
    • 2023-03-02
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2020-06-12
    • 2021-06-02
    相关资源
    最近更新 更多