18

重複の可能性:
std::fstream からの FILE* の取得

私は Linux に取り組んでおり、この OS の主なモデルはファイル記述子です。

C++ から始まるネイティブ Linux ファイル記述子を取得するライブラリまたは方法があるかどうか疑問に思っていましたstd::fstream

boost::iostreamというクラスがあるので考えてみましfile_descriptorたが、その目的は私が達成したいものとは異なることがわかりました。

それを行う方法を知っていますか?

4

4 に答える 4

8

逆に、ファイル記述子をラップする独自のストリーム バッファを実装してから、iostream代わりに を使用することもできますfstreamBoost.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.
}
于 2012-07-19T10:19:25.670 に答える
4

ファイル ストリーム (または実際には ) のプライベート ファイル ハンドルを取得する公式の方法はありませstd::basic_filebufん。移植可能であり、プラットフォーム固有の関数の使用を思いとどまらせる必要があるからです。

ただし、継承のような醜いハックを実行しstd::basic_filebufて、そこからファイル ハンドルをこじ開けようとすることはできます。ただし、C++ ライブラリの異なるバージョンでは壊れる可能性があるため、お勧めしません。

于 2012-07-19T10:16:45.357 に答える
4

標準ライブラリはファイルストリームの実装方法を義務付けていないため、std::fstream からファイル番号を抽出する (標準的な) 方法はありません。

むしろ、これを行う場合は、C ファイル API を使用する必要があります ( を使用FILE*)。

于 2012-07-19T10:09:23.443 に答える
2

標準 C++ でも .NET でも、ファイル記述子の公開はサポートされていませんlibstdc++

于 2012-07-19T10:08:50.333 に答える