如何使用libcurl c ++从url保存XML文件
How to save XML file from url using libcurl c++
如何使用libcurl c ++从URL保存XML文件,以便以后可以使用pugixml加载它。 我试过这个,但它不起作用
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written = fwrite(ptr, size, nmemb, stream);
return written;
}
...
CURL *curl;
FILE *fp;
CURLcode result;
char *c_url = "http://some_url.xml";
char outfilename[FILENAME_MAX] = "sth.xml";
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
fp = fopen(outfilename,"wb");
curl_easy_setopt(curl, CURLOPT_URL, c_url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
result = curl_easy_perform(curl);
}
curl_global_init(CURL_GLOBAL_DEFAULT);
...
curl_easy_cleanup(curl);
curl_global_cleanup();
fclose(fp);
通过将char*
设置为const
来修复错误后,如下所示:
char const* c_url = "http://some_url.xml";
你的代码对我来说很好用。
但是,您并不总是希望写入接收磁盘的数据。有时您只想将其保存在内存中以便即时使用它。
在这里,我编写了一个函数,用于将URL的目标下载到一个std::string
中,您可以随心所欲地使用它。我还使用智能指针使代码异常安全且通常更安全。
// write the data into a `std::string` rather than to a file.
std::size_t write_data(void* buf, std::size_t size, std::size_t nmemb,
void* userp)
{
if(auto sp = static_cast<std::string*>(userp))
{
sp->append(static_cast<char*>(buf), size * nmemb);
return size * nmemb;
}
return 0;
}
// To make the function thread safe you can use a smart pointer to
// hold your CURL session pointer.
// A deleter to use in the smart pointer for automatic cleanup
struct curl_dter{void operator()(CURL* curl) const
{ if(curl) curl_easy_cleanup(curl); }};
// A smart pointer to automatically clean up out CURL session
using curl_uptr = std::unique_ptr<CURL, curl_dter>;
// download the URL into a `std::string`.
std::string get_url(std::string const& url)
{
std::string data;
if(auto curl = curl_uptr(curl_easy_init()))
{
curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str());
curl_easy_setopt(curl.get(), CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &data);
CURLcode ec;
if((ec = curl_easy_perform(curl.get())) != CURLE_OK)
throw std::runtime_error(curl_easy_strerror(ec));
}
return data;
}
int main()
{
curl_global_init(CURL_GLOBAL_DEFAULT);
auto xml = get_url("http://google.co.uk");
std::cout << xml << 'n';
curl_global_cleanup();
}
注意:我还添加了CURLOPT_FOLLOWLOCATION
选项,以防文档上有重定向。
如果有人感兴趣.. 最后,我最终使用以下代码:
const char* f = "new_file.xml";
if (curl){
const char* c_url = "some_url";
FILE* ofile = fopen(f, "wb");
if (!ofile) { fprintf(stderr, "Failed to open file: %sn", strerror(errno)); }
if (ofile){
curl_easy_setopt(curl, CURLOPT_URL, c_url);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, ofile);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeData);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_perform(curl);
fclose(ofile);
}
}
pugi::xml_document doc;
doc.load_file(f);
感谢所有的帮助!
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 在C++中将类(带有Vector成员)保存为二进制文件
- C++.我想将更改后的特定字符行保存在字符串中
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- 如何使用url确定网站协议
- 下载URL中的所有文件
- 哈希文件递归并保存到矢量Cryptopp中
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 无法通过头文件保存变量的值
- 我们可以将数据永久保存为数据结构吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 如何使用libcurl c ++从url保存XML文件