user979516
user979516

Reputation: 7

Libcurl sample code come up with error

Hi I'm very new to libcurl and I want to essentially get the source code from a website into a string so I can extract data from there using simple functions in visual C++.

This is the code I'm using (taken from the curl site, sample section):

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

I get these errors when I try to compile it.

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

I don't know much about pointing or casting but if anyone knows how to fix this so I can literally read the WHOLE HTML source code in a string. From here I plan to scan through the string and get data out of it.

Upvotes: 0

Views: 1346

Answers (1)

the.malkolm
the.malkolm

Reputation: 2421

first error, change

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

to

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

second error, change

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

to

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

and God bless you working with libcurl if you can't fix this errors by yourself

Upvotes: 3

Related Questions