libcurl真是个好东西,不过我以前C/C++学得太不扎实,以致想写个返回字符串的函数都为难。由于不同网页的大小不一,有可能有的网页只有十来K,有的网页却有200多K,如果分配一个200多K的静态变量,这样又太不划算了,何况还没测试频繁分配这样大的静态变量会有什么后遗症,所以只好将下载的网页源码保存到文件了。
下面是一个最简单的用libcurl库获取网页源码并保存到文件的实例:
#include <io.h> #include "curl/curl.h" #pragma comment(lib, "ws2_32.lib") #pragma comment ( lib, "libcurl.lib" ) #pragma comment ( lib, "ws2_32.lib" ) #pragma comment ( lib, "winmm.lib" ) #pragma comment ( lib, "wldap32.lib" ) //这是libcurl接收数据的回调函数,相当于recv的死循环 //其中stream可以自定义数据类型,这里我传入的是文件保存路径 static size_t write_callback( void *ptr, size_t size, size_t nmemb, void *stream ) { int len = size * nmemb; int written = len; FILE *fp = NULL; if ( access( (char*)stream, 0 ) == -1 ) { fp = fopen( (char*) stream, "wb" ); } else { fp = fopen( (char*) stream, "ab" ); } if (fp) { fwrite( ptr, size, nmemb, fp ); } return written; } int GetUrl( const char *url, char *savepath ) { CURL *curl; CURLcode res; struct curl_slist *chunk = NULL; curl = curl_easy_init(); if ( curl ) { curl_easy_setopt( curl, CURLOPT_VERBOSE, 0L ); curl_easy_setopt( curl, CURLOPT_URL, url ); //指定回调函数 curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_callback); //这个变量可作为接收或传递数据的作用 curl_easy_setopt( curl, CURLOPT_WRITEDATA, savepath ); res = curl_easy_perform( curl ); if (res == CURLE_OK) { return 1; } return 0; } } int main( void ) { if ( GetUrl( "t.sina.com.cn", "c:/1.txt" ) ) { printf( "OK" ); } return 0; }