我对C和XML有点问题。 基本上,我使用的代码是:
#include <stdio.h>
#include <curl/curl.h>
#include <libxml/tree.h>
#include <string.h>
#include <stdlib.h>
#define WEBPAGE_URL "http://gdata.youtube.com/feeds/api/videos/mKxLmdBzS10"
typedef struct {
char *contents;
int size;
} data;
/*Curl uses this function to write the contents of a webpage to a file/stdout*/
size_t write_data( void *ptr, size_t size, size_t nmeb, void *stream)
{
data *curl_output = (data *)stream;
int curl_output_size = size * nmeb;
curl_output->contents = (char *) realloc(curl_output->contents, curl_output->size + curl_output_size + 1);
if (curl_output->contents) {
memcpy(curl_output->contents, ptr, curl_output_size); /*Copying the contents*/
curl_output->size += curl_output_size;
curl_output->contents[curl_output->size] = 0;
return curl_output->size;
}
}
int main()
{
data webpage;
webpage.contents = malloc(1);
webpage.size = 1;
CURL *handle = curl_easy_init();
curl_easy_setopt(handle,CURLOPT_URL,WEBPAGE_URL); /*Using the http protocol*/
curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION, write_data); /*Setting up the function meant to copy data*/
curl_easy_setopt(handle,CURLOPT_WRITEDATA, &webpage); /*The data pointer to copy the data*/
curl_easy_perform(handle);
curl_easy_cleanup(handle);
printf("Contents: %s",webpage.contents);
int i;
}
我的意思是不要回复这个XML:http://gdata.youtube.com/feeds/api/videos/mKxLmdBzS10。
但是目前,我只能获得任意金额,有时只有一半,有时只有一个季度。
有人知道我做错了吗?
答案 0 :(得分:1)
问题在于你的write_data函数。
此行将新数据复制到数组的开头,而不是当前结束。
memcpy(curl_output->contents, ptr, curl_output_size); /*Copying the contents*/
您需要偏移指针:
memcpy(curl_output->contents + curl_output->size, ptr, curl_output_size); /* Copying the contents */
此外,您的返回值很糟糕 - 应该return(curl_output_size);
表示成功,通过调用时实际处理的字节数 - 并在括号return(0);
下方显示错误
您可能还会发现,如果不是让curl_output->size
和curl_output_size
选择更多不同的名称,而是curl_output->len
?