std::ifstream fin("foo.png", std::ios::binary);
std::string data;
data.reserve(1000000);
std::copy(std::istreambuf_iterator<char>(fin),
std::istreambuf_iterator<char>(),
std::back_inserter(data));
Вы можете читать файлы изображений на std::string
с таким кодом. Отрегулируйте параметр для метода reserve
, чтобы он превышал 99% размера файла. Нулевые байты (которые вы называете NULL-терминаторами) обрабатываются правильно как ifstream
, так и string
.
Я нашел хорошую статью , в которой сравниваются несколько методов загрузки двоичных файлов. Вот самый быстрый метод из этой статьи:
std::ifstream fin("foo.png", std::ios::binary);
fin.seekg(0, std::ios::end);
std::string data;
data.resize(fin.tellg());
fin.seekg(0, std::ios::beg);
fin.read(&data[0], data.size());
А вот самый короткий:
std::ifstream fin("foo.png", std::ios::binary);
std::string data((std::istreambuf_iterator<char>(fin)),
std::istreambuf_iterator<char>());
Обновление
Нечто подобное можно использовать для подачи функции обратного вызова (я не проверял это):
std::ifstream fin("foo.png", std::ios::binary);
fin.seekg(0, std::ios::end);
...
curl_easy_setopt(m_ctx, CURLOPT_INFILESIZE, fin.tellg());
curl_easy_setopt(m_ctx, CURLOPT_READDATA, (void *)&fin);
fin.seekg(0, std::ios::beg);
...
static size_t put_callback(void *ptr, size_t size, size_t nmemb, void *data){
std::ifstream* in = static_cast<std::ifstream*>(data);
if(in->eof()) return 0;
in->read((char *)ptr, size*nmemb);
return in->gcount();
}