2016-10-16 15 views
2

Handling map of files in c++」は「いいえ、std::map<std::string, std::ofstream*>を使用する必要がありますが、これはnewdeleteのアクションにつながりますが、それほどきれいではありません。std :: mapを使ってstd :: ofstreamを扱うことは可能ですか?

"Is std::ofstream movable?はい!" 「std::map<>::insert using non-copyable objects and uniform initialization」はofstreamのコレクションを扱うことが可能ですかstd::mapを使用していますか?ファイルストリームを閉じることについて心配することはなく、メモリを解放するにはdeleteを使用します。

std::map<std::string, std::ofstream>を使用している間は作成、使用(書き込む)、閉じてコピーするだけで妥協することができます。

+0

"1はファイルストリームを閉じて心配してメモリを解放するために削除されませんように"。これは、スマートポインタが使用するものです(移動セマンティクスがうまくいかない場合、または多態性ストリームが必要な場合)。 –

+0

でも、それ自体のofstream自体もそうですよね?スコープから外れている場合、デストラクタが呼び出され、すべての要素のデストラクタ、つまりofstreamのものが呼び出され、すべてのファイルが適切に閉じられます。 – athos

答えて

2

はい可能です。以下のサンプルコードを参照してください。

私はstd::map<std::string, std::ofstream>を使用している間にそれを妥協することができます作成​​し、使用して(それを書き込む)とクローズし、それをコピーしないでください。

これらはコピーできませんので、最終的なコメントでは正しいです、あなたはそれをコピーすることはできません。あなたがしたいことがあれば、割り当てを移すことができます。

#include <iostream> 
#include <fstream> 
#include <map> 

int main() 
{ 
    std::map<std::string, std::ofstream> map; 
    map.emplace("foo", std::ofstream("/tmp/foo")); 
    map.emplace("bar", std::ofstream("/tmp/bar")); 

    map["foo"] << "test"; 
    map["foo"].flush(); 

    std::ifstream ifs("/tmp/foo"); 
    std::string data; 
    ifs >> data; 

    std::cout << data << '\n'; 

    return 0; 
} 

出力:

テスト

+1

moveオペレーションを省略することができます。このコードはofstreamオブジェクトを構築し、std :: mapストレージに移動します。 'map.emplace( "foo"、 "/ tmp/foo");'オブジェクトをインプレースで構築します。 – TimVdG

関連する問題