From Crypto++ Wiki
Jump to: navigation, search

A FileSink allows you to write data to a file using a BufferedTransformation. You can pass an existing ostream and the library will write to it. Or you can have the library open an ostream for you (in which case the file is opened with ios::trunc).

The companion source object is a FileSource.

#include <cryptopp/files.h>


FileSink (std::ostream &out)
FileSink (const char *filename, bool binary=true)

out is an existing standard ostream.

filename is the name of a file. The FileSink will open the file as an ostream and truncate it if it exists.

binary is passed to the underlying ostream.

When the library opens the stream, it is opened with the ios::trunc flag.


The following example demonstrates creation of a FileSink.

string filename;
FileSink f( filename, true /*binary*/ );

The following example demonstrates reading a file using a FileSource, and placing the contents of the file in a string. This is known as pipelining.

string s;
FileSource file( filename, true, new StringSink( s ) );

cout << s << endl;

true indicates the FileSource should propagate to all filters in the chain. A slightly more complicated example of pipelining is below. Before the FileSource is placed in the string, it is HexEncoded.

string s;
FileSource( filename, true, new HexEncoder( new StringSink( s ) ) );

cout << s << endl;

From above, note that the HexEncoder and StringSink created with new do not require explicit destruction - the FileSource will call delete on the HexEncoder, which in turns calls delete on the StringSink when it (the FileSource) is destroyed.

byte data[] = { 0x00, 0x01, 0x02, 0x03 };
string sink;

HexEncoder encoder;
encoder.Attach( new StringSink( sink ) );
encoder.Put( data, sizeof( data ) );

cout << sink << endl;