我的目标是使用Cpp从特定的URL获取CSV或XLS。
打开以下链接时

http://www.centrodeinformacao.ren.pt/userControls/GetExcel.aspx?T=CRG&P=01-01-2007&variation=PT
,可以在浏览器工具中看到
c++ - 从Cpp中的URL下载时获取空的CSV-LMLPHP
302重定向,并且实际上是从以下URL下载文件
http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?T=CRG&P=02-01-2007&variation=PT
如下图所示(请求URL)
c++ - 从Cpp中的URL下载时获取空的CSV-LMLPHP
如果我手动转到两个链接中的任何一个,那么.xls文件下载就很好,因此我们最好在重定向后再使用一个。

我决定在W10机器上继续使用libcurl和Visual Studio 2017。在Visual Studio 2017项目中包括libcurl的推荐方法是使用vcpkg,这就是我使用的方法。

1.安装vcpkg
  • 打开Git Bash,CD C:/ Program Files /并克隆this repo

  • c++ - 从Cpp中的URL下载时获取空的CSV-LMLPHP
  • 打开命令提示符,cd C:/ Program Files / vcpkg,运行bootstrap-vcpkg.bat

  • c++ - 从Cpp中的URL下载时获取空的CSV-LMLPHP
    然后运行vcpkg integrate install c++ - 从Cpp中的URL下载时获取空的CSV-LMLPHP

    2.安装libcurl
  • 运行vcpkg install curl

  • c++ - 从Cpp中的URL下载时获取空的CSV-LMLPHP

    3.创建一个新项目
  • 只需创建Visual C++> Windows桌面> Windows控制台应用程序

  • c++ - 从Cpp中的URL下载时获取空的CSV-LMLPHP
    能够立即使用#include <curl/curl.h> c&#43;&#43; - 从Cpp中的URL下载时获取空的CSV-LMLPHP

    4.当前结果
    然后,从以下答案中得到启发
  • https://stackoverflow.com/a/6951203/9415908
  • https://stackoverflow.com/a/1636415/9415908

  • 并使用以下代码
    #include "pch.h"
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <iostream>
    #include <stdio.h>
    #include <curl/curl.h>
    #include <string.h>
    
    size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
        size_t written = fwrite(ptr, size, nmemb, stream);
        return written;
    }
    
    void downloadFile(const char* url, const char* fname) {
        CURL *curl;
        FILE *fp;
        CURLcode res;
        curl = curl_easy_init();
        if (curl) {
            fp = fopen(fname, "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);
        }
    }
    
    int main(void) {
    
        downloadFile("http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?T=CRG&P=01-01-2007&variation=PT", "C:\\Users\\molecoder\\Desktop\\test.csv");
    
    }
    
    我可以在所需的文件夹中看到一个test.csv,但这是一个空文件。
    c&#43;&#43; - 从Cpp中的URL下载时获取空的CSV-LMLPHP

    最佳答案

    转到该特定URL后,将下载一个.xls文件。我不介意使用XLS而不是CSV,因此将其更改为我可以按预期获取文件。

    downloadFile("http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?T=CRG&P=01-01-2007&variation=PT", "C:\\Users\\molecoder\\Desktop\\test.xls");
    
    c&#43;&#43; - 从Cpp中的URL下载时获取空的CSV-LMLPHP
    这是最终代码
    #include "pch.h"
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <iostream>
    #include <stdio.h>
    #include <curl/curl.h>
    #include <string.h>
    
    size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
        size_t written = fwrite(ptr, size, nmemb, stream);
        return written;
    }
    
    void downloadFile(const char* url, const char* fname) {
        CURL *curl;
        FILE *fp;
        CURLcode res;
        curl = curl_easy_init();
        if (curl) {
            fp = fopen(fname, "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);
        }
    }
    
    int main(void) {
    
        downloadFile("http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?T=CRG&P=01-01-2007&variation=PT", "C:\\Users\\molecoder\\Desktop\\test.xls");
    
    }
    

    关于c++ - 从Cpp中的URL下载时获取空的CSV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62850908/

    10-10 21:21