This is simpler than using
      getistream() or
	getostream() and constructing
      a std::istreambuf_iterator or a
      std::ostreambuf_iterator:
    
#include <x/fditer.H> x::fdbase filedesc=x::fd::base::open("file", O_RDONLY); std::string str; std::copy(x::fdinputiter(filedesc, 1024), x::fdinputiter(), std::back_insert_iterator<std::string>(str));
      x::fdinputiter
      constructs an input iterator that reads from the underlying file
      descriptor transport. The second optional parameter is the size of
      the internal buffer, which defaults to the
      x::fd::buffer_size
      property.
      The default constructor instantiates an ending iterator value.
    
x::fdbase filedesc=x::fd::base::create("file", 0777); std::string str; x::fd::outputiter iter(filedesc, 1024); iter=std::copy(str.begin(), str.end(), iter); // ... iter.flush();
      x::fdoutputiter
      constructs an output iterator that writes to the underlying file
      descriptor transport, also using an internal buffer.
      It's destructor does not flush unwritten buffer contents,
      flush() must be explicitly invoked to do that.
    
An input and an output iterator can be constructed concurrently, however they are completely independent from each other, and use their own separate buffers. Reading from the input iterator does not flush the output iterator, and writing to the output iterator does not clear the input buffer.
      The iterators can be constructed from any subclass of the
      file descriptor transport superclass,
      and not just x::fd. This includes
      x::gnutls::session.
      The iterators also hold their own reference to the file descriptor
      transport object they're iterating over.
      Using
      std::istreambuf_iterator or
      std::ostreambuf_iterator requires that the
      underlying stream objects remain in scope.
      x::fdinputiter and
      x::fdoutputiter, in addition to being
      references to reference-counted objects themselves, hold their own
      reference on the underlying reference-counted file descriptor transport
      superclass.
    
	The iterators throw an exception if the underlying file
	descriptor transport's pubwrite()
	returns 0, indicating an error writing to the file descriptor.
	An exception also gets thrown when
	pubread() returns 0
	with errno set, indicating an error reading the
	underlying file descriptor.
	pubread() returning 0
	with errno cleared indicates an ordinary and of
	file, and the input iterator gets set to the ending sequence
	value.