プログラムを移植可能にする必要がある場合は不可能です。C ++ 11標準は、それを行うための統一された方法を指定していません。
overflow()
ただし、システム固有のAPIを使用して、仮想関数とxsputn()
仮想関数をオーバーライドし、指定された記述子を使用して各文字または文字のシーケンスをストリームに書き込む独自の出力ストリームバッファーを定義できます。
これらの線に沿った何か:
class my_ostream_buf : public std::streambuf
{
public:
my_ostream_buf(int fd) : _fd(fd) { }
protected:
virtual int_type overflow (int_type c)
{
if (c != EOF)
{
char ch = c;
if (write(_fd, &ch, 1) != 1)
{
return EOF;
}
}
return c;
}
// This is not strictly necessary, but performance is better if you
// write a sequence of characters all at once rather than writing
// each individual character through a separate system call.
virtual std::streamsize xsputn(const char* s, std::streamsize num)
{
return write(_fd, s, num);
}
private:
int _fd = 0;
};
そして、これはあなたがそれをどのように使うかです:
using namespace std;
int main()
{
int fd = ...; // Any file descriptor
my_ostream_buf buf(fd);
ostream os(&buf); // Take care of the lifetime of `buf` here, or create your
// own class that derives from ostream and encapsulates an
// object of type my_ostream_buf
os << "Hello" << endl;
}