I want to store a result for character string with

2020-04-17 06:45发布

I write a program with 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/ I examine search it google but I can't find . I want to store char[] not stdout.

Is a question of the beginner thanking you in advance

标签: c libcurl
2条回答
在下西门庆
2楼-- · 2020-04-17 07:26

Check out the curl_easy_setopt() function.

You would want to register a callback using CURLOPT_WRITEFUNCTION - this callback would be called whenever data is received. From within the callback you could do whatever you want with the data.

Note - this is somewhat tricky stuff for a beginner. You need to understand what function pointers are.

(this answer is based on reading the API in http://curl.haxx.se/libcurl/c/curl_easy_setopt.html - I have never used libcurl).

EDIT -
Here is an example found by googling for CURLOPT_WRITEFUNCTION, in the curl-library mailing list. This example is by Daniel Stenberg.

查看更多
倾城 Initia
3楼-- · 2020-04-17 07:37

I get it !

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

Thank you Hexagon.

查看更多
登录 后发表回答