2012-07-19 11 views
11

Powiel możliwe:
Getting a FILE* from a std::fstreamOdzyskiwanie deskryptor pliku z std :: fstream

pracuję na Linuksie i deskryptorów są głównym modelem w tym OS.

Zastanawiam się, czy istnieje jakaś biblioteka lub jakikolwiek sposób na odzyskanie natywnego deskryptora pliku Linux, zaczynając od C++ std::fstream.

Myślałem o boost::iostream, ponieważ istnieje klasa o nazwie file_descriptor, ale zrozumiałem, że jej cel jest inny niż ten, który chcę osiągnąć.

Czy wiesz, jak to zrobić?

+1

Dlaczego musisz deskryptor pliku? –

+0

Szukam również NON-Standard, ponieważ będę trzymać się platformy Linux. Znalazłem tę stronę również. Ktoś go użył? Anyhttp: //www.ginac.de/~kreckel/fileno/ –

+6

To pytanie nie jest duplikatem. To pytanie pyta, jak uzyskać deskryptor pliku z iostream. Deskryptor pliku to koncepcja niskiego poziomu jądra. Pytanie wskazywane jako oryginał, którego jest podobno duplikat, mówi o strumieniach FILE *, które nie są tym samym. – Daniel

Odpowiedz

5

Możesz przejść w inny sposób: zaimplementuj własny bufor strumienia, który otoczy deskryptor pliku, a następnie użyje go z iostream zamiast fstream. Korzystanie z Boost.Iostreams może ułatwić zadanie.

dla przenośne rozwiązanie gcc jest:

#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

Brak obsługi demaskowania deskryptora pliku ani w standardowym C++, ani w libstdc++.

3

Nie ma (standardowego) sposobu wyodrębnienia numeru pliku ze std :: fstream, ponieważ biblioteka standardowa nie określa sposobu implementacji strumieni plików.

Zamiast tego musisz użyć interfejsu API pliku C, jeśli chcesz to zrobić (używając FILE*).

3

Nie istnieje oficjalny sposób uzyskania prywatnego pliku pliku strumienia (lub faktycznie std::basic_filebuf), tylko dlatego, że powinien być przenośny i zniechęcać do korzystania z funkcji specyficznych dla platformy.

Możesz jednak zrobić brzydki hack, np. Dziedziczyć std::basic_filebuf, a następnie spróbować podważyć uchwyt pliku. Nie jest to jednak coś, co polecam, ponieważ prawdopodobnie złamie różne wersje biblioteki C++.

Powiązane problemy