重複の可能性:
std :: fstreamからファイル*を取得
私はLinuxに取り組んでおり、ファイル記述子がこのOSのメインモデルです。
C++ std::fstream
から始まるネイティブLinuxファイル記述子を取得するためのライブラリまたは方法があるかどうか疑問に思いました。
boost::iostream
というクラスがあるので、file_descriptor
について考えましたが、その目的が私が達成したいものとは異なることを理解しました。
あなたはそれをする方法を知っていますか?
逆の方法もあります。ファイル記述子をラップする独自のストリームバッファを実装し、それを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.
}
ファイルストリームのプライベートファイルハンドル(または実際には std::basic_filebuf
)を取得する公式の方法はありません。これは、移植可能であり、プラットフォーム固有の関数の使用を推奨しないためです。
ただし、std::basic_filebuf
を継承するような醜いハックを実行し、そこからファイルハンドルをこじ開けようとすることができます。おそらくC++ライブラリの異なるバージョンで壊れるので、私がお勧めするものではありません。
標準ライブラリはファイルストリームの実装方法を義務付けていないため、std :: fstreamからファイル番号を抽出する(標準の)方法はありません。
むしろ、これを実行する場合は、CファイルAPIを使用する必要があります(FILE*
を使用)。
標準のC++でもlibstdc++
でもファイル記述子を公開することはサポートされていません。