我有一個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