ist die Spur der Anrufe von Dokumentation:
void std::basic_ofstream::close();
Effektiv ruft rdbuf()->close()
. Tritt während des Betriebs ein Fehler auf, wird setstate(failbit)
aufgerufen.
std::basic_streambuf<CharT,Traits>* std::basic_ofstream::rdbuf() const;
Gibt den zugehörigen Strompuffer. Wenn kein Stream-Puffer zugeordnet ist, wird NULL
zurückgegeben.
std::basic_streambuf
tatsächlich erbt std::basic_filebuf
daher:
std::basic_filebuf<CharT, Traits>* std::basic_filebuf::close();
Wenn ein Bereich Put existieren (zB Datei zum Schreiben geöffnet wurde), overflow(Traits::eof())
ersten Anrufe alle anstehenden Ausgabe in die Datei zu schreiben, einschließlich beliebiger Unshift-Sequenzen.
Wenn die zuletzt genannte Funktion, aus underflow()
, overflow()
, seekpos()
und seekoff()
war overflow()
, dann std::codecvt::unshift()
nennt, vielleicht mehrere Male, die unshift Sequenz zu bestimmen nach dem Imbued locale und schreibt diese Sequenz in Datei mit overflow(Traits::eof())
.
Schließt dann die Datei wie durch Aufrufen von std::fclose
, unabhängig davon, ob einer der vorhergehenden Aufrufe erfolgreich war oder fehlgeschlagen ist.
. HINWEIS:close()
wird in der Regel durch den destructor von std::basic_filebuf
genannt (was wiederum typischerweise durch den destructor von std::basic_fstream
genannt wird
Zunächst einmal können wir sehen, dass es doesn‘ t rufen Sie eigentlich flush()
direkt, wie Sie erwartet.Noch die Spülung Effekt tritt tatsächlich in der std::basic_filebuf::close()
Methode.Zusätzlich können wir sehen, dass es immer noch ein bisschen manipuliert mit einer Datei, dh das Schreiben der Unshift-Sequenz passiert dann, Die Datei wird einfach geschlossen.
Achten Sie auf die HINWEIS oben: In den meisten Fällen müssen Sie nicht einmal std::basic_ofstream::close()
explizit aufrufen.
Ich habe meine Frage umformuliert, bitte sehen Sie die Bearbeitung des ursprünglichen Beitrags. – NPS