GRIFF zu bekommen von einem std::ofstream
Ist es möglich, die zugrunde liegende Datei-HANDLE, das von einem std::ofstream (Visual C++ 2005)?
Dies ist das Gegenteil von dieser Frage:
Kann ich mit CreateFile, aber zwingen Sie den Griff in eine std::ofstream?
Der Grund, warum ich wollen, das ist also zu ändern, die Attribute der Datei (z.B. ERSTELLUNGSDATUM) ist ohne öffnen der Datei mit CreateFile.
- Die standard-Bibliothek ist, gut, standard, so dass er keine Ahnung hat, was Ihr Betriebssystem und kann die Funktionalität entsprechend; es hat überall arbeiten. Die Antwort ist also Nein, in C++, aber vielleicht ist ja in nicht-standard-C++; ich weiß nicht, ob letzteres eine Wahl, die Sie haben können, gehen Sie einfach die "lange" Weg, aber ich wollte sichergehen, dass war klar.
- Ich war glücklich, sich für eine Lösung, die funktioniert nur in Visual C++
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den C++ - standard stellt keine Mittel für das festlegen oder abrufen der raw-Datei-Deskriptoren von einer
ofstream
, also ich glaube nicht, dass dies möglich ist. Was ist möglich, allerdings wäre der Aufbau einer benutzerdefiniertenstreambuf
Klasse, die Strom Zwischenspeichern und von einerHANDLE
, dann definieren Sie eine benutzerdefinierteostream
geben, die diesen Puffer. Ich bin mir nicht sicher, ob das wirklich was du suchst, aber es ist ein gangbarer Weg.Meine Antwort sollte mit einem vorangestellten "ich bin ein Unix-Entwickler, der kein Windows-Entwickler." Aber ich hatte das gleiche problem, das Sie haben, und das ist, wie ich wählte, um es anzugehen. Ich würde gerne eine bessere Antwort. Meine Antwort unter Ihre Haut zu kriechen, aber es funktionierte.
First off, müssen wir die _Filet* aus der fdbuf. Dies ist ein privater member, so können wir nicht nur eine neue Klasse erstellen, gibt uns Einblick in die it. So, ich ändern den header fstream sind, um einen neuen Freund hinzufügen-Funktion in filebuf, so dass die spezifische Funktion lassen Sie uns betrügen und erhalten Sie Zugriff auf das Mitglied (ich habe es nur unter die definition "_Filet *_Myfile;"):
Nun haben wir eine öffentliche Funktion, um den Zugriff auf die privaten member. Schritt zwei ist, schreiben Sie die Funktion:
Schließlich, Sie brauchen nur zu rufen, außer, dass rdbuf gibt falschen Typ (iobuf, anstatt filebuf). Da wir bereits in "hier werden Drachen" für den gesamten Prozess, können wir auch machen jeder Gänsehaut (aber im wirklichen Leben, führen die Typüberprüfung, die hier zur Validierung der Besetzung der abgeleitete Typ):
Sorry, dass ich nicht eine sauberere Antwort.
Nicht. Sie können nicht einmal auf die
FILE*
(oder_Filet*
wie es ist intern bekannt) instd::basic_filebuf
.Dies ist nicht möglich in standard-C++. Jedoch, mit Boost.IOStreams Bibliothek ist es nicht schwer. Erstellen Sie eine
Device
, wickeln Sie es in einboost::iostreams::stream_buffer<>
und fügen Sie entsprechende stream mitboost::iostreams::stream<>
.Mit dem VisualC++ 2010 Bibliotheken, die folgenden arbeiten sollten. Ich nehme an, es ist das gleiche für VisualC++ 2005, aber Sie haben, um zu überprüfen:
std::ifstream
hat keinen solchen Konstruktor. Ist das eine Erweiterung oder wild guess?Nicht. Ich versuche viele Möglichkeiten.
diese Zeile:
"std::ifstream ifs(fh);"
kann nicht wrok in einigen msvs, wie 2008.Ich einen anderen Weg finden, Sie aufzählen können, Griff in Ihrem Prozess, und finden Sie den Griff, die rund um das mit dem Namen.
In dieser Weise, ich bekomme den Griff.