【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だけどそれが使われてなさそう。
とりあえず原因はわかったけど、どう直すべきかはわからない。
(意図がよくわかってない)
現状では、ファイルを開いてから設定するしかないかな。