我有一个ofstream
的地图。我正在浏览一个消息包,并且希望将与特定符号有关的每条消息写入其各自的文件,实质上是将包文件分成更小的文件。当我<<
到ofstream
时它会写入文件。但是,当我尝试<<
到通过映射迭代器访问的ofstream
时,它即使编译好也会崩溃。如何写入通过地图迭代器访问的ofstream
我使用映射的原因是为了确保数据包标头不会多次写入给定的符号。
void write_packet_to_symbol_file(packet p)
{
string path = "E:\\20170131\\";
map<string,ofstream&> outs;
for (message m : p.messages) {
map<string,ofstream&>::iterator it = outs.find(m.symbol.name);
if (it == outs.end()) {
string full_path = path + m.symbol.name + ".CAP";
ofstream of;
of.open(full_path, ios_base::app);
// write packet header since first message for that symbol
of << p.get_header();
outs.emplace(m.symbol.name,of);
}
map<string,ofstream&>::iterator it2 = outs.find(m.symbol.name);
if (it2 != outs.end())
it2->second << m.get_message_content();
}
我在做什么错?
如果找不到名称,则会打开一个新流并将其添加到地图中。但你永远不会指定它来指向它。 – Barmar
你做错了两件事:你假设只是因为程序编译,这是正确的。这显然不是真的。其次,流对象不可复制,所以你不能构造和打开流对象,然后将它们复制到地图中。它们是可移动的,但您需要正确移动流对象,才能正常工作。 –
将不正确的新节点插入到映射中后,您要遵守的迭代器“it”仍等于outs.end()。 – felix