【问题标题】:C libcurl print webpage contentsC libcurl 打印网页内容
【发布时间】:2012-04-03 22:35:44
【问题描述】:

说到 C,我完全是个菜鸟,但我在这里找到了这个 curl 示例 http://curl.haxx.se/libcurl/c/getinmemory.html

    #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;
    }

它对我来说很完美,但是否可以稍微调整一下,让它打印内容而不是网页内容的大小?

提前致谢!

【问题讨论】:

  • 懒得检查代码,但我会认为chunk.memory是页面的内容。
  • 那我如何从 chunk.memory 中读取数据呢?你能提供一个链接或一些很酷的东西

标签: c curl libcurl


【解决方案1】:

你试过了吗:

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

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

你可能会感到惊讶。

【讨论】:

  • 您知道如何将 chunk.memory 的内容转换为 char 吗? sprintf 对我不起作用
  • 你的问题毫无意义。 “char”是一个单字节。您不能将整个网页放在一个字母中! chuck.memory 已经是 char*(指向字符数组的指针)。 “sprintf 对我不起作用”到底是什么意思?
猜你喜欢
  • 2021-08-01
  • 2022-10-24
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多