如何使用 libcurl(或其他方式)从 HTTP 服务器检索文件? [复制]

Posted

技术标签:

【中文标题】如何使用 libcurl(或其他方式)从 HTTP 服务器检索文件? [复制]【英文标题】:How to retrieve file from HTTP server using libcurl (or another way)? [duplicate] 【发布时间】:2014-11-23 16:05:37 【问题描述】:

我正在尝试从 C 中的 yahoo Finance 获取股票报价。我知道如何获取我想要的文件,您在浏览器中输入此 URL 很简单,例如:download.finance.yahoo.com/d/quotes .csv?s=YHOO+GOOG+MSFT&f=sl1d1t1c1hgvbap2 并自动下载文件。 我的问题是我想使用 C 程序来获取这个文件,我发现 libcurl 显然可以让你做到这一点,但我的努力没有任何联系。 我想知道如何使用 libcurl 获取这样的文件,或者如果 libcurl 无法从 URL 获取文件。

这是我的 libcurl 代码,用于获取不起作用的文件(没有错误,最后只是一个空文件):

#define CURL_STATICLIB
#include <stdio.h>
#include <curl/curl.h>
#include <curl/easy.h>
#include <string.h>

size_t write_data(void* ptr,size_t size,size_t nmemb,FILE* stream)
    size_t written;
    written=fwrite(ptr,size,nmemb,stream);


int main(void)
    CURL* curl;
    FILE* fp;
    CURLcode res;
    char* url="http://download.finance.yahoo/d/quotes.csv?s=YHOO+GOOG+MSFT&f=sl1d1t1c1hgvbap2";
    //char* url="https://marketviewer.equiduct.com";
    char outfilename[FILENAME_MAX]="test.txt";
    curl=curl_easy_init();
    if(curl)
        fp=fopen(outfilename,"wb");
        curl_easy_setopt(curl,CURLOPT_URL, url);
        curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);
        curl_easy_setopt(curl,CURLOPT_WRITEDATA,fp);
        res=curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        fclose(fp);
    
    else 
        printf("Error !!!\n");
    
    return 0;

【问题讨论】:

【参考方案1】:

尝试使用他们的示例获取文件:

http://curl.haxx.se/libcurl/c/getinmemory.html

描述:描述如何使用回调系统将文档提取到内存缓冲区中,而无需写入文件。

如果需要,您应该将数据保存到文件中。

【讨论】:

此链接显示如何将数据存储在内存中而不是文件中。看来我用同样的函数来获取数据,不同的是它们将数据存储在内存中。 您可以将缓冲区存储到文件中 是的,我的意思是除了内存存储之外,他们还使用我用来获取和存储数据的东西。我看不出获取的区别,我错过了什么吗? 您可以使用CURLOPT_WRITEDATA 传递一个FILE* 并修改代码,使其直接写入文件。或者您可以使用 write 或等效方法将整个缓冲区写入文件。 我正在使用该功能,请查看我发布的代码。我是 libcurl 的初学者,所以如果我遗漏了什么,请不要害怕告诉我一些显而易见的事情。

以上是关于如何使用 libcurl(或其他方式)从 HTTP 服务器检索文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

libcurl怎样判断数据接收完成

使用 Git 的 libcurl 中不支持或禁用协议 https

libcurl 中不支持或禁用协议“https”-如何检查当前版本的 libcurl [关闭]

C++用libcurl通过HTTP以表单的方式Post数据到服务器

使用 libcurl 进行 http-post

我必须使用 HTTP/2.0 发送 Apple 推送通知吗?我可以使用 libcurl 吗?