私はofstream
というマップを持っています。私はメッセージのパケットを調べ、特定のシンボルに関する各メッセージをそれぞれのファイルに書きたいと思っています。本質的には、パケットファイルをより小さなものに分割します。 ofstream
にI <<
が書き込まれるとファイルに書き込まれます。しかし、マップイテレータ経由でアクセスした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
あなたは2つのことを間違っている:プログラムがコンパイルされただけであると仮定しているが、それは正しい。それは明らかに真実ではありません。第2に、ストリームオブジェクトはコピー可能ではないため、ストリームオブジェクトを作成して開くことはできず、後でマップにコピーすることはできません。それらは移動可能ですが、ストリームオブジェクトを適切に移動する必要があります。 –
新しいノードをマップに間違って挿入した後、あなたが派遣しようとしているイテレータ 'it'はまだouts.end()と等しくなります。 – felix