2016-05-08 1 views
2

私はブーストを使用してファイルを開きたい::のiostream ::このコードのファイルができません理由は分かりません。 boost :: iostreams :: file_sinkを使うとうまくいきます。多分あなたは何が間違っているのか考えているでしょうか?私は何かを忘れましたか?私はブーストバージョン1.60を使用していますはブーストで開いているファイル::のiostream ::ファイル

+0

私はいくつかのテストを行い、boost :: iostreams :: fileは既に存在するオープンファイルのように見えます。ですから、std :: ofstreamでファイルを作成しなければなりません。しかし、それはまた、ブーストで作成する必要がありますか? – Paul

+1

[[1](https://github.com/boostorg/iostreams/blob/develop/include/boost/iostreams/device/file.hpp))[[2](https ://github.com/boostorg/iostreams/blob/71b4ed218754cfa86a062e883755549d86aa57b4/include/boost/iostreams/detail/fstream.hpp)]。デフォルトモードは 'in | out'です。 [docs](http://en.cppreference.com/w/cpp/io/basic_filebuf/open)によると、ファイルが存在しないときにエラーが発生します。オープンモードを適切に設定する必要があります。 –

答えて

2

iostreams/device/file.hppを見ると、コンストラクタがデフォルトのオープンモードin|outを提供していることがわかります。

basic_file(const std::string& path, 
      BOOST_IOS::openmode mode = 
       BOOST_IOS::in | BOOST_IOS::out, 
      BOOST_IOS::openmode base_mode = 
       BOOST_IOS::in | BOOST_IOS::out); 

、それはこのモードでopen(...)メソッドを呼び出しています。

template<typename Ch> 
basic_file<Ch>::basic_file 
    (const std::string& path, BOOST_IOS::openmode mode, 
     BOOST_IOS::openmode base_mode) 
{ 
    open(path, mode, base_mode); 
} 

open(...)方法は、このモードを使用して、implの新しいインスタンスを作成します。

template<typename Ch> 
void basic_file<Ch>::open 
    (const std::string& path, BOOST_IOS::openmode mode, 
     BOOST_IOS::openmode base_mode) 
{ 
    pimpl_.reset(new impl(path, mode | base_mode)); 
} 

実装では、ファイルI/Oのためのstd::basic_filebufを使用しています。

struct impl { 
    impl(const std::string& path, BOOST_IOS::openmode mode) 
     { file_.open(path.c_str(), mode); } 
    ~impl() { if (file_.is_open()) file_.close(); } 
    BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) file_; 
}; 

iostreams/detail/fstream.hppに定義されるマクロ:

# define BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) std::basic_filebuf<Ch> 

std::basic_filebufのドキュメント(または特異的に、そのopen(...)方法)によれば:

openmode & ~ate Action if file already exists Action if file does not exist 
------------------------------------------------------------------------------ 
out|in   Read from start     Error 

ファイルがまだ存在しないときに新しいファイルを作成するには、適切なオープンモードを指定する必要があります。あなたの場合、これは既に存在するファイルに何を起こしたいかによって、in|out|appまたはin|out|truncのいずれかを意味します。

関連する問題