Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从Cpp中的URL下载时获取空CSV_C++_File_Download_Visual Studio 2017_Libcurl - Fatal编程技术网

C++ 从Cpp中的URL下载时获取空CSV

C++ 从Cpp中的URL下载时获取空CSV,c++,file,download,visual-studio-2017,libcurl,C++,File,Download,Visual Studio 2017,Libcurl,我的目标是使用Cpp从特定URL获取CSV或XLS 当打开以下链接时 http://www.centrodeinformacao.ren.pt/userControls/GetExcel.aspx?T=CRG&P=01-01-2007&variation=PT ,可以在浏览器工具中查看 302重定向,文件实际从以下URL下载 http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?

我的目标是使用Cpp从特定URL获取CSV或XLS

当打开以下链接时

http://www.centrodeinformacao.ren.pt/userControls/GetExcel.aspx?T=CRG&P=01-01-2007&variation=PT
,可以在浏览器工具中查看

302重定向,文件实际从以下URL下载

http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?T=CRG&P=02-01-2007&variation=PT
如下图所示(请求URL)

如果我手动转到这两个链接中的任何一个,a.xls文件的下载都很好,因此我们最好在重定向后使用该链接。


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


1.安装vcpkg
  • 打开Git Bash,cd C:/Program Files/并克隆
  • 打开命令提示符,cd C:/Program Files/vcpkg,运行
    bootstrap vcpkg.bat
  • 并在运行后
    vcpkg集成安装


    2.安装libcurl
  • 运行
    vcpkg安装curl

  • 3.创建新项目
  • 简单创建VisualC++ > Windows桌面> Windows控制台应用程序
  • 要能够立即使用
    #包括


    4.当前结果 然后,在下面的答案中得到启发

    并使用以下代码

    #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");
    
    }
    
    #包括“pch.h”
    #定义\u CRT\u安全\u无\u警告
    #包括
    #包括
    #包括
    #包括
    #包括
    大小写入数据(void*ptr、大小、大小nmemb、文件*流){
    写入的大小=写入(ptr、大小、nmemb、流);
    书面回报;
    }
    无效下载文件(常量字符*url,常量字符*fname){
    卷曲*卷曲;
    文件*fp;
    卷曲编码;
    curl=curl_easy_init();
    if(curl){
    fp=fopen(fname,“wb”);
    curl_easy_setopt(curl,CURLOPT_URL,URL);
    curl\u easy\u setopt(curl,CURLOPT\u WRITEFUNCTION,write\u data);
    curl_easy_setopt(curl,CURLOPT_WRITEDATA,fp);
    res=旋度(curl)\u容易执行(curl);
    旋度\轻松\清洁(旋度);
    fclose(fp);
    }
    }
    内部主(空){
    下载文件(“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,但它是一个空文件


    您必须了解shell的工作原理

    注意:使用
    system()
    时,执行命令的是shell

    你的命令:

    shell将“&”字符视为“and”运算符。作为命令执行“and”的左右两侧。因此,它将上述命令视为三个命令:


    P=01-01-2007
    变量=PT

    第二个命令失败
    p=01-01-2007

    要解决此问题,您可能需要引用字符串

    "http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?T=CRG&P=01-01-2007&variation=PT“


    一旦转到特定的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");
    

    这是最后的代码

    #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");
    
    }
    
    #包括“pch.h”
    #定义\u CRT\u安全\u无\u警告
    #包括
    #包括
    #包括
    #包括
    #包括
    大小写入数据(void*ptr、大小、大小nmemb、文件*流){
    写入的大小=写入(ptr、大小、nmemb、流);
    书面回报;
    }
    无效下载文件(常量字符*url,常量字符*fname){
    卷曲*卷曲;
    文件*fp;
    卷曲编码;
    curl=curl_easy_init();
    if(curl){
    fp=fopen(fname,“wb”);
    curl_easy_setopt(curl,CURLOPT_URL,URL);
    curl\u easy\u setopt(curl,CURLOPT\u WRITEFUNCTION,write\u data);
    curl_easy_setopt(curl,CURLOPT_WRITEDATA,fp);
    res=旋度(curl)\u容易执行(curl);
    旋度\轻松\清洁(旋度);
    fclose(fp);
    }
    }
    内部主(空){
    下载文件(“http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?T=CRG&P=01-01-2007&variation=PT,“C:\\Users\\molecoder\\Desktop\\test.xls”);
    }
    
    尝试在URL周围添加引号。@HolyBlackCat当前使用
    std::string URL=date.strftime(“http://www.centrodeinformacao.ren.pt/_layouts/CI.GetExcel/SafeGetExcel.aspx?T=CRG&P=%d-%m-%Y和变化=PT“。这就是你的建议吗?不,我是说
    start
    可能需要在URL周围加上引号<代码>标准::字符串op=“开始\”+url+“\” > @ HyyBrAcCAT,它解决了“P”和“变体”的问题,但它没有下载文件。为什么在C++中使用C++而不是C?.net?刚刚更新了问题后,从@ HyyBrask.@ MyoOver中执行了<代码>开始/代码>命令:将标题设置为您指定的URL。要从文件所在的位置下载()@molecoder读取我链接的文档。“开始”是在窗口中运行命令的命令。您只需设置标题,而不运行命令。所以你不需要“开始”或设置标题并使用url作为“开始”的命令,只要阅读你共享的文档,我还不明白你在暗示什么。。。
    #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");
    
    }