我想使用libcurl库打开一个远程日期文件,并使用istream对其进行遍历。我浏览了thread中的漂亮示例,但是它将远程文件写入本地文件。取而代之的是,我希望将远程读取推送到istream进行后续的编程操作。这可能吗?我将不胜感激。
最好的,
亚伦
最佳答案
与STL自己的流相比,Boost's IO Stream可能是更好的解决方案。至少创建助推流要简单得多。从boost自己的文档中:
#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中遇到了段错误,这似乎是因为我不知道如何使用curl本身。
关于c++ - 可以使用libcurl将远程文件作为istream读取吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3023988/