2012-04-03 69 views
-1

我是一个总的小白,当谈到C,但我在这里http://curl.haxx.se/libcurl/c/getinmemory.htmlÇ的libcurl打印网页内容

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

    #include <curl/curl.h> 

    struct MemoryStruct { 
     char *memory; 
     size_t size; 
    }; 


    static size_t 
    WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) 
    { 
     size_t realsize = size * nmemb; 
     struct MemoryStruct *mem = (struct MemoryStruct *)userp; 

     mem->memory = realloc(mem->memory, mem->size + realsize + 1); 
     if (mem->memory == NULL) { 
     /* out of memory! */ 
     printf("not enough memory (realloc returned NULL)\n"); 
     exit(EXIT_FAILURE); 
     } 

     memcpy(&(mem->memory[mem->size]), contents, realsize); 
     mem->size += realsize; 
     mem->memory[mem->size] = 0; 

     return realsize; 
    } 


    int main(void) 
    { 
     CURL *curl_handle; 

     struct MemoryStruct chunk; 

     chunk.memory = malloc(1); /* will be grown as needed by the realloc above */ 
     chunk.size = 0; /* no data at this point */ 

     curl_global_init(CURL_GLOBAL_ALL); 

     /* init the curl session */ 
     curl_handle = curl_easy_init(); 

     /* specify URL to get */ 
     curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.example.com/"); 

     /* send all data to this function */ 
     curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); 

     /* we pass our 'chunk' struct to the callback function */ 
     curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); 

     /* some servers don't like requests that are made without a user-agent 
     field, so we provide one */ 
     curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); 

     /* get it! */ 
     curl_easy_perform(curl_handle); 

     /* cleanup curl stuff */ 
     curl_easy_cleanup(curl_handle); 

     /* 
     * Now, our chunk.memory points to a memory block that is chunk.size 
     * bytes big and contains the remote file. 
     * 
     * Do something nice with it! 
     * 
     * You should be aware of the fact that at this point we might have an 
     * allocated data block, and nothing has yet deallocated that data. So when 
     * you're done with it, you should free() it as a nice application. 
     */ 

     printf("%lu bytes retrieved\n", (long)chunk.size); 

     if(chunk.memory) 
     free(chunk.memory); 

     /* we're done with libcurl, so clean it up */ 
     curl_global_cleanup(); 

     return 0; 
    } 

它的工作非常适合我,但有可能调整这个东西有点发现这个例子卷曲所以它打印的内容而不是网页内容的大小?

在此先感谢!

+1

太懒惰检查代码,但我会认为chunk.memory是页面的内容。 – Corbin 2012-04-03 22:38:53

+0

我该如何从chunk.memory读取呢?你能提供一个链接或一些很酷的内容 – Stefan 2012-04-03 22:40:44

+0

printf(“%s”,chunk.memory); – keety 2012-04-03 22:42:47

回答

2

你试过:

printf("%lu bytes retrieved\n", (long)chunk.size); 

printf("%s", chunk.memory); 

你可能会惊讶。

+0

我会试试看,谢谢。 – Stefan 2012-04-03 22:43:38

+0

它工作了,谢谢! (对不起noob问题btw ...) – Stefan 2012-04-03 22:46:47

+0

你有一个想法如何我可以chunk.memory的内容到char? sprintf不适用于我 – Stefan 2012-04-03 23:18:41