Libcurl示例代码出现错误

时间:2011-10-11 23:26:36

标签: c++ visual-c++ curl web-scraping libcurl

您好我是libcurl的新手,我想基本上将网站的源代码转换为字符串,以便我可以使用Visual C ++中的简单函数从中提取数据。

这是我正在使用的代码(取自卷曲网站,示例部分):

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

我在尝试编译时遇到这些错误。

cpp(25): error C2440: '=' : cannot convert from 'void *' to 'char *'
 Conversion from 'void*' to pointer to non-'void' requires an explicit cast

cpp(46): error C2440: '=' : cannot convert from 'void *' to 'char *'
Conversion from 'void*' to pointer to non-'void' requires an explicit cast

我对指点或转换知之甚少,但如果有人知道如何解决这个问题,那么我可以在字符串中读取整个HTML源代码。从这里开始,我计划扫描字符串并从中获取数据。

1 个答案:

答案 0 :(得分:1)

第一个错误,更改

mem->memory = realloc(mem->memory, mem->size + realsize + 1);

mem->memory = (char *) realloc(mem->memory, mem->size + realsize + 1);

第二个错误,更改

chunk.memory = malloc(1);  /* will be grown as needed by the realloc above */

chunk.memory = (char *) malloc(1);  /* will be grown as needed by the realloc above */

如果你不能自己解决这个错误,上帝保佑你使用libcurl