2012-07-19 9 views
11

Mögliche Duplizieren:
Getting a FILE* from a std::fstreamAbrufen von Dateideskriptor von einem std :: fstream

ich auf Linux arbeite und Dateideskriptoren sind das Hauptmodell in diesem Betriebssystem.

Ich frage mich, ob es eine Bibliothek oder eine Möglichkeit gibt, den nativen Linux-Dateideskriptor ab einer C++ std::fstream abzurufen.

Ich dachte über boost::iostream da gibt es eine Klasse namens file_descriptor, aber ich verstand, dass der Zweck ist anders als die, die ich erreichen möchte.

Kennen Sie einen Weg, dies zu tun?

+1

Warum benötigen Sie den Dateideskriptor? –

+0

Ich suche auch nach NON-Standard, da ich bei der Linux-Plattform bleiben werde. Ich habe diese Seite auch gefunden. Jeder benutzt es? Anyhttp: //www.ginac.de/~krekel/fileno/ –

+6

Diese Frage ist kein Duplikat. Diese Frage fragt, wie man einen Dateideskriptor von einem Iostream erhält. Ein Dateideskriptor ist ein Low-Level-Kernel-Konzept. Die Frage, auf die sich das Original bezieht, von dem es sich angeblich um ein Duplikat handelt, spricht von FILE * -Streams, die nicht gleich sind. – Daniel

Antwort

5

Sie können den anderen Weg gehen: Implementieren Sie Ihren eigenen Stream-Puffer, der einen Dateideskriptor umschließt und ihn dann mit iostream anstelle von fstream verwendet. Die Verwendung von Boost.Iostreams kann die Aufgabe erleichtern.

Nicht-portable gcc Lösung ist:

#include <ext/stdio_filebuf.h> 

{ 
    int fd = ...; 
    __gnu_cxx::stdio_filebuf<char> fd_file_buf{fd, std::ios_base::out | std::ios_base::binary}; 
    std::ostream fd_stream{&fd_file_buf}; 
    // Write into fd_stream. 
    // ... 
    // Flushes the stream and closes fd at scope exit. 
} 
2

Es gibt keine Unterstützung für das Aussetzen von Dateideskriptor weder in Standard C++ noch in libstdc++.

3

Es gibt keinen (Standard) Weg, die Dateinummer aus einem std :: fstream zu extrahieren, da die Standardbibliothek nicht vorschreibt, wie Dateiströme implementiert werden.

Stattdessen müssen Sie die C-Datei-API verwenden, wenn Sie dies tun möchten (mit FILE*).

3

Es gibt keinen offiziellen Weg, um die private Datei Handle eines Datei-Stream (oder tatsächlich eine std::basic_filebuf), nur weil es tragbar sein sollte und entmutigen Verwendung von plattformspezifischen Funktionen.

Allerdings können Sie hässliche Hack wie erben std::basic_filebuf und von diesem versuchen, um die Datei Handle herauszuholen. Ich empfehle es jedoch nicht, da es wahrscheinlich verschiedene Versionen der C++ - Bibliothek durchbrechen wird.