libcurl ライブラリを使用してリモートの日付ファイルを開き、istream で反復処理したいと考えています。このスレッドの素敵な例を見てきましたが、リモート ファイルをローカル ファイルに書き込みます。代わりに、その後のプログラムによる操作のために、リモート読み取りを istream にプッシュしたいと考えています。これは可能ですか?助けていただければ幸いです。
ベスト、アーロン
Boost の IO Streamは、STL 独自のストリームよりも優れたソリューションかもしれません。少なくとも、ブースト ストリームを作成する方がはるかに簡単です。ブースト自身のドキュメントから:
#include <curl/curl.h>
#include <boost/iostreams/stream.hpp>
class CURLDevice
{
private:
CURL* handle;
public:
typedef char char_type;
typedef boost::iostreams::source_tag category;
CURLDevice()
{
handle = curl_easy_init();
}
CURLDevice(const std::string &url)
{
handle = curl_easy_init();
open( url );
}
~CURLDevice()
{
curl_easy_cleanup(handle);
}
void open(const std::string &url)
{
curl_easy_setopt(handle, CURLOPT_URL, url.c_str());
curl_easy_setopt(handle, CURLOPT_CONNECT_ONLY, 1);
curl_easy_perform(handle);
}
std::streamsize read(char* s, std::streamsize n)
{
size_t read;
CURLcode ret = curl_easy_recv(handle, s, n, &read);
if ( ret == CURLE_OK || ret == CURLE_AGAIN )
return read;
else
return -1;
}
};
typedef boost::iostreams::stream<CURLDevice> CURLStream;
int main(int argc, char **argv)
{
curl_global_init(CURL_GLOBAL_ALL);
{
CURLStream stream("http://google.com");
char buffer[256];
int sz;
do
{
sz = 256;
stream.read( buffer, sz );
sz = stream.gcount();
std::cout.write( buffer, sz );
}
while( sz > 0 );
}
curl_global_cleanup();
return 0;
}
注: 上記のコードを実行すると、CURL で segfault が発生します。これは、curl 自体の使用方法が正確にわからないことが原因のようです。