2016-10-16 4 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"이 (가) ofstreamstd::map을 (를) 사용하여 컬렉션을 처리 할 수 ​​있습니까? 따라서 파일 스트림을 닫는 것에 대해 걱정할 필요가 없으며 메모리를 해제하기 위해 delete을 걱정할 필요가 없습니다.

나는 std::map<std::string, std::ofstream>을 사용하는 동안 생성, 쓰기 (쓰기) 및 닫기 만 수행 할 수 있습니다. 복사하지 마십시오.

+0

"하나 filestreams 폐쇄에 대해 걱정하고 메모리를 해제하기 위해 삭제하지 않도록". 그게 스마트 포인터 (이동 의미론이 당신을 위해 작동하지 않거나 다형 스트림을 원한다면)입니다. –

+0

하지만 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

관련 문제