2012-07-19 125 views
11

可能重複:
Getting a FILE* from a std::fstream檢索文件描述符:: fstream的

我在Linux和文件描述符工作在這個操作系統的主力機型。

我想知道是否有任何庫或任何方式從C++ std::fstream開始檢索本機Linux文件描述符。

我想過boost::iostream,因爲有一個名爲file_descriptor的類,但我明白它的目的與我想實現的不同。

你知道一些方法嗎?

+1

爲什麼你需要的文件描述符? – 2012-07-19 10:06:46

+0

因爲我會堅持使用Linux平臺,所以我也期待NON-Standard。我也發現這個頁面。任何人都使用過它?Anyhttp://www.ginac.de/~kreckel/fileno/ – 2012-07-19 10:20:08

+6

這個問題不是重複的。這個問題詢問如何從iostream獲取文件描述符。文件描述符是一個低級的內核概念。這個問題被指出,原來這被認爲是重複的,說明FILE *流,這是不一樣的。 – Daniel 2014-07-04 05:34:33

回答

5

你可以換個方式:實現你自己的流緩衝區,它包裝一個文件描述符,然後用iostream而不是fstream來使用它。使用Boost.Iostreams可以使任務更容易。

不可移植的GCC的解決方案是:

#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

在標準C++和libstdc++中都沒有公開文件描述符的支持。

3

由於標準庫沒有規定如何實現文件流,所以沒有(標準)方法從std :: fstream中提取文件編號。

相反,如果要執行此操作(使用FILE*),則需要使用C文件API。

3

沒有官方的方式來獲取文件流的私有文件句柄(或實際上是std::basic_filebuf),僅僅是因爲它應該是可移植的並且不鼓勵使用特定於平臺的功能。

但是,你可以做像繼承std::basic_filebuf醜陋的黑客攻擊,並試圖撬出文件句柄。這不是我推薦的,因爲它可能會在不同版本的C++庫中打破。