読者です 読者をやめる 読者になる 読者になる

Boost.Iostreams ファイルが開けてないのに開けたことになる

C++

【Iostreams】 How to check whether file has ben opened?


ほんとだ・・・。(VC++8.0 + Boost 1.41.0/1.42.0)

#include <iostream>
#include <string>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/file.hpp>

int main()
{
    const std::string filename("test");
    boost::iostreams::stream<boost::iostreams::file_source> file(filename.c_str());

    std::cout << std::boolalpha << file.is_open() << std::endl; // true
}

内部実装で使われてるstd::basic_filebufではfalseが返る。

#include <iostream>
#include <string>
#include <fstream>

int main()
{
    const std::string filename("test");

    std::basic_filebuf<char> file;
    file.open(filename.c_str(), std::ios::in | std::ios::out);

    std::cout << std::boolalpha << file.is_open() << std::endl; // false
}

streamを通さずにfile_source/fileを直接使うとfalseが返る。

#include <iostream>
#include <string>
#include <fstream>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/file.hpp>

int main()
{
    const std::string filename("test");
    boost::iostreams::file_source file(filename.c_str());

    std::cout << std::boolalpha << file.is_open() << std::endl; // false
}

デバッグしたら、streamを通すとfile_sourceのis_openが呼ばれずに
以下が呼ばれてる。

// <boost/iostreams/detail/streambuf/indirect_streambuf.hpp>

template<typename T, typename Tr, typename Alloc, typename Mode>
inline bool indirect_streambuf<T, Tr, Alloc, Mode>::is_open() const
{ return (flags_ & f_open) != 0; }

indirect_streambufのTはfile_sourceだけどそれが使われてなさそう。


とりあえず原因はわかったけど、どう直すべきかはわからない。
(意図がよくわかってない)


現状では、ファイルを開いてから設定するしかないかな。