C++ にはmapというクラスが用意されています.このクラスは, vector のようにindexで配列の要素にアクセスするのではなく,キーと呼ばれる「名前」でデータを呼び出すことができます.このmapクラスはログをファイルに書き出す場合に非常に効果的です.
よくあるログデータは次のような形式で書かれます(,区切りのテキストファイル(csvファイル)).
[c]
time, angle, velocity, acc
0, 20, 0, 0
1, 40, 20, 0
2, 60, 20, 20
[/c]
そして,このようにファイルを書き出すコードは次のようになります.
[cpp]
std::vector
std::vector
double time, angle, velocity, acc;
/*
* データ取得・計算
*/
// vectorに各変数値を代入
data.at(0) = time;
data.at(1) = angle;
data.at(2) = velocity;
data.at(3) = acc;
// ファイルに書き込み
std::ofstream writingFile;
writingFile.open(“log.csv”, std::ios::app);
for (size_t i = 0; i < header.size() - 1; i++) { writingFile << header.at(i) << ","; } writingFile << header.at(header.size() - 1) << std::endl; for (size_t i = 0; i < data.size() - 1; i++) { writingFile << data.at(i) << ","; } writingFile << data.at(data.size() - 1) << std::endl; [/cpp] このコードで問題になるのが,vector内のデータの順番です. まず,headerの文字とデータの対応は常に正しくなければなりません.dataに変数を代入する際に,書き込む順番を間違えただけで正しくログが取れなくなります.上のコードの場合はheaderの定義とファイルの書き込むコードが近く比較しながらかけるので,まだ間違えにくいです.しかし一般的にdataに変数を代入するのはloop部分の最後になるので,代入する順番を間違えることが多々あります. また,後でデータを変更した場合にはさらにややこしいことになります.例えば, [cpp] std::vector
[/cpp]
と変更した場合には
[cpp]
data.at(0) = time;
data.at(1) = force;
data.at(2) = angle;
data.at(3) = velocity;
data.at(4) = acc;
[/cpp]
1以降を全てずらさないといけない上に,また順番を間違えてしまう危険性があります.
そこでstd::mapを使うことでこの問題が解決できます.
std::mapを使うと,コードは次のように書き換えることができます.
[cpp]
std::vector
std::map
double time, angle, velocity, acc;
/*
* データ取得・計算
*/
// mpに各変数値を代入
mp.at(“time”) = time;
mp.at(“angle”) = angle;
mp.at(“velocity”) = velocity;
mp.at(“acc”) = acc;
// ファイルに書き込み
std::ofstream writingFile;
writingFile.open(“log.csv”, std::ios::app);
for (size_t i = 0; i < header.size() - 1; i++) { writingFile << header.at(i) << ","; } for (int i = 0; i < (int)header.size() - 1; ++i) { writingFile << mp.at(header.at(i)) <<","; } writingFile << mp.at(header.at(header.size() - 1))<< std::endl; [/cpp] このようにstd::mapの場合は,数字ではなく名前の文字列で呼び出せ,ファイルを書き込む時もheaderの順番に合わせて自動で書き込めるので,代入する時の順番を気にする必要がありません. mapを使って,ログを書き出す際のバグを減らしましょう! また,ファイルを書き出す時だけではなく,データをjsonなどで送信する時も同様の効果があります・
コメント