Основная проблема в функции writeFile
, где вызывается string_size
.Почему вы предполагаете, что в потоке JPG не может появиться нулевой байт?Предположим, что вы читаете первый блок - 1024 байта, который имеет значение 0 в 10-й позиции, блок ставится в очередь в q
, затем во время записи вы вызываете string_size
, который возвращает 10, а оставшаяся часть этого блока не записывается в файл -и никогда не будет записан, потому что erase
вызывается на q
.
. Вы можете сохранить pair
с указателем на данные блока и его длину:
vector< std::pair< char *, int> > q;
, затем в readFile
:
if (length - file.tellg() <= 1024) {
int tmp = length - file.tellg();
char *c = new char[tmp];
file.read(c,tmp);
q.emplace_back(c,tmp); // <--- added
mtx.unlock();
break;
} else {
char *c = new char[1024];
file.read(c,1024);
q.emplace_back(c,1024); // <--- added
mtx.unlock();
}
и в writeFile
:
if(q.empty()) { mtx.unlock(); break; } // in this place unlock should also be called
o.write(q.front().first, q.front().second); // <--added
q.erase(q.begin());
также вместо хранения необработанного указателя в q
рассмотрите возможность использования интеллектуального указателя, например unique_ptr
.