2009-05-22 17 views
2

我用libcurl編寫了一個程序。我想用libcurl存儲字符串的結果

#include <stdio.h> 
#include <string.h> 
#include <curl/curl.h> 

#define URL_MAX 256 

int main(int argc, char *args[]) 
{ 
    CURL *curl; 
    CURLcode res; 
     curl_global_init(CURL_GLOBAL_DEFAULT); 
    curl = curl_easy_init(); 
    curl_easy_setopt(curl, CURLOPT_URL, args[1]); 
    curl_easy_perform(curl); 
    curl_easy_cleanup(curl); 

    return 0; 
} 

$ GCC tinyCurl.c $ GCC curl-config --libs tinyCurl.c $ ./a.out http://example.com/ 我檢查它搜索谷歌,但我無法找到。 我想存儲char []不是標準輸出。

是初學者 請多關照

回答

3

退房的curl_easy_setopt()功能的問題。

您希望使用CURLOPT_WRITEFUNCTION註冊回調 - 只要收到數據,就會調用此回調函數。從回調中你可以隨心所欲地處理數據。

注 - 這對初學者來說有點棘手。你需要了解什麼是函數指針。

(這個回答是基於讀取http://curl.haxx.se/libcurl/c/curl_easy_setopt.html中的API--我從未使用過libcurl)。

EDIT -
下面是通過使用Google爲CURLOPT_WRITEFUNCTION,在curl-library mailing list找到一個例子。這個例子是由Daniel Stenberg提出的。

+0

非常感謝,但是,你能給我更詳細的代碼示例嗎? – freddiefujiwara 2009-05-22 09:34:41

3

我明白了!

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 

#include <curl/curl.h> 
#include <curl/types.h> 
#include <curl/easy.h> 

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) 
{ 
    char buf[size*nmemb+1]; 
    char * pbuf = &buf[0]; 
    memset(buf, '\0', size*nmemb+1); 
    size_t i = 0; 
    for(; i < nmemb ; i++){ 
    strncpy(pbuf,ptr,size); 
    pbuf += size; 
    ptr += size; 
    } 
    printf("%s",buf); 
    return size * nmemb; 
} 

int main(int argc, char **argv) 
{ 
    CURL *curl_handle; 
    curl_handle = curl_easy_init(); 
    enum{Command,URL,NumCommands}; 
    if(NumCommands != argc){ 
     fprintf(stderr,"Usage : %s <url>\n",argv[0]); 
     return 1; 
    } 
    curl_easy_setopt(curl_handle, CURLOPT_URL, argv[URL]); 
    curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS ,1); 
    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION,&write_data); 
    curl_easy_perform(curl_handle); 
    curl_easy_cleanup(curl_handle); 
    return 0; 
} 

謝謝六邊形。

+0

然後,接受Hexagon的回答 – bortzmeyer 2009-05-22 15:31:32