我想使用以下代码打开带有boost :: iostreams :: file的文件:
boost::iostreams::file file("test.txt");
if(!file.is_open()) {
throw std::runtime_error("Could not open file");
}
但它不会打开文件,我不知道为什么。当我使用boost :: iostreams :: file_sink时,它可以工作。也许你知道什么是错的?我忘记了什么吗?我正在使用Boost版本1.60
答案 0 :(得分: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));
}
该实现使用std::basic_filebuf
作为文件I / O.
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
,具体取决于您希望在现有文件中发生什么。