【问题标题】:Using std::ifstream to load in an array of struct data type into a std::vector使用 std::ifstream 将结构数据类型的数组加载到 std::vector
【发布时间】:2010-05-12 16:10:39
【问题描述】:

我正在使用 C++ 开发位图加载器,当从 C 样式数组移动到 std::vector 时,我遇到了一个 Google 似乎没有答案的常见问题。

8 位和 4 位位图包含一个调色板。调色板有蓝色、绿色、红色和保留组件,每个 1 字节大小。

// Colour palette     
struct BGRQuad
{
     UInt8 blue; 
     UInt8 green; 
     UInt8 red; 
     UInt8 reserved; 
};

我遇到的问题是,当我创建 BGRQuad 结构的向量时,我无法再使用 ifstream 读取函数将文件中的数据直接加载到 BGRQuad 向量中。

// This code throws an assert failure!
std::vector<BGRQuad> quads;
if (coloursUsed) // colour table available
{   // read in the colours
    quads.reserve(coloursUsed);
    inFile.read( reinterpret_cast<char*>(&quads[0]), coloursUsed * sizeof(BGRQuad) ); 
}

有谁知道如何直接读入向量而无需创建 C 数组并将数据复制到 BGRQuad 向量中?

【问题讨论】:

  • 不要尝试使用 HTML 标签来格式化您的代码。只需选择代码并点击文本输入区域上方的 1010 按钮。此外,使用复制和粘贴从您的 IDE/编辑器发布代码 - 您发布的显然不是真正的代码。
  • @Thomas 请不要更正问题中的代码 - 代码必须保持 OP 发布的内容。如果您想指出它不正确,请发表评论。
  • @Neil:通常我不会。但这显然是一个错字,我认为这无关紧要。
  • 感谢尼尔的提示,我什至没有注意到“1010”按钮。以后肯定会用到。

标签: c++ vector ifstream


【解决方案1】:

您需要使用quads.resize(coloursUsed) 代替quads.reserve(coloursUsed)。保留只是设置向量对象的容量,但不分配内存。调整大小实际上会分配内存。

【讨论】:

  • @Sent1nel,这里的首选说法是单击答案旁边的复选标记以接受它。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多