Betrachten wir iostreams/device/file.hpp, können wir sehen, dass der Konstruktor bietet standardmäßig öffnen Modus von 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);
und dass es die open(...)
Methode mit diesem Modus aufruft.
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);
}
Die open(...)
Methode erstellt dann eine neue Instanz von impl
, diesen Modus verwenden.
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));
}
Die Implementierung verwendet eine std::basic_filebuf
für die Datei-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_;
};
Das Makro Wesen in iostreams/detail/fstream.hpp definiert:
# define BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) std::basic_filebuf<Ch>
nun entsprechend der Dokumentation von std::basic_filebuf
(oder spezifisch, ihre open(...)
Methode):
openmode & ~ate Action if file already exists Action if file does not exist
------------------------------------------------------------------------------
out|in Read from start Error
Damit eine neue Datei erstellt werden kann, wenn noch keine Datei vorhanden ist, müssen Sie einen geeigneten Öffnungsmodus angeben. In Ihrem Fall würde dies entweder in|out|app
oder in|out|trunc
bedeuten, abhängig davon, was Sie mit einer bereits existierenden Datei machen möchten.
Ich habe einige Tests gemacht und finde heraus, dass boost :: iostreams :: Datei nur offene Dateien scheint, die bereits existieren. Also muss ich die Datei vorher mit std :: ofstream erstellen, dann funktioniert es. Aber es sollte auch mit Boost erstellt werden, oder? – Paul
Es verwendet 'std :: filebuf' unter [[1] (https://github.com/boostorg/iostrooms/blob/develop/include/boost/iostraces/device/file.hpp)] [[2] (https : //github.com/boostorg/iostreams/blob/71b4ed218754cfa86a062e883755549d86aa57b4/include/boost/iostrets/detail/fstream.hpp)]. Der Standardmodus ist 'in | out'. Laut [docs] (http://en.cppreference.com/w/cpp/io/basic_filebuf/open) verursacht das einen Fehler, wenn die Datei nicht existiert. Sie müssen Ihren Öffnungsmodus entsprechend einstellen. –