2016-05-08 2 views
2

ich eine Datei mit boost :: iostreams :: Datei mit diesem Code öffnen möchten:Datei kann nicht geöffnet mit boost :: iostreams :: Datei

boost::iostreams::file file("test.txt"); 
if(!file.is_open()) { 
    throw std::runtime_error("Could not open file"); 
} 

Aber es wird nicht die Datei, und ich don öffnen Ich weiß nicht warum. Wenn ich boost :: iostreams :: file_sink verwende, funktioniert es. Vielleicht hast du eine Idee, was ist los? Habe ich etwas vergessen? Ich benutze Boost Version 1.60

+0

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

+1

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. –

Antwort

2

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.

Verwandte Themen