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
の両方で正しく処理されます。
私は、バイナリファイルの読み込みのいくつかの方法が比較される良いarticleを見つけました。ここでは、その記事から最速の方法です:
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());
そしてここでは、最短1です:
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();
}
のコールバックfrunctionでどのようにこれは、単に4つのスペースですべてをインデントします。または、コードを貼り付けてそれを選択し、次に示すようなボタンを押します: '{}'。また、テキストを小さな文字で囲んでインラインでコードを配置することもできます。私は彼らがバックティックと呼ばれると思う。私がこれまで使用してきたすべてのキーボードでは、キーの左上隅にあるキーです。 –
@ベンジャミン:ドイツ語のキーボードレイアウトでは、右上にあり、バックスペースキーの左側にあります。 :)また、Ctrl + Altキーを押して取得する必要があります。いずれの場合でも、 '\'は意味します。 – Xeo
実際に使用するライブラリはバイナリデータを文字列に入れたいのですか?あなたはそれが望むファイル名ではないと確信していますか? 'char'型はほぼすべてのプラットフォーム上のバイトですが、' std :: string'を使用してバイナリデータを格納するのは間違っています。 –