Определяет ли объект методы, расширяющие его классы, для реализации? Нет, и поэтому он не должен быть абстрактным.
Концепция абстрактного класса имеет четко определенное значение, которое не относится к объекту.
Вы не пишете нижний колонтитул gzip, содержащий CRC и длину данных:
std::streamoff size = source.tellg();
int totalSize = size;
int tcrc = 0;
...
n = source.rdbuf()->sgetn( in, CHUNK );
strm.avail_in = (uInt)n;
tcrc = crc32( tcrc, (uint8_t*)in, n );
...
(void)deflateEnd( &strm );
dest.write( (char*)&tcrc, sizeof( tcrc ) );
dest.write( (char*)&totalSize, sizeof( totalSize ) );
return write_len;
Ваш метод __write_magic_header
также неверен, поскольку он выделяет только 10 байтов, но затем записывает 10 символов с помощью sprintf
который фактически напишет 11 байтов, переполняющих ваш буфер.
В окнах вы не можете отправлять двоичные данные через std::cout
, у вас та же проблема, что и при открытии файла с ofstream
без указания binary
. Чтобы исправить эту проблему, перед использованием std::cout
:
_setmode( _fileno( stdout ), _O_BINARY );
необходимо указать следующее:
#ifdef
, Макросы, которые вы используете, являются подробностями реализации и не должны давать / незначительной разницы в производительности современного компилятора.