C++ CURL在C++;无法打开

C++ CURL在C++;无法打开,c++,curl,visual-c++,visual-studio-2017,C++,Curl,Visual C++,Visual Studio 2017,我正在用C++编写一个程序,在这个程序中,我必须使用cURL下载一个文件,然后再打开它,但问题是,当我在下载后试图打开文件时,它没有打开。我正在尝试打开一个.exe文件。下面是代码的一部分,负责文件下载 curl = curl_easy_init(); if (curl) { fp = fopen(outfilename.c_str(), "w"); curl_easy_setopt(curl, CURLOPT_URL, links[index]);

我正在用
C++
编写一个程序,在这个程序中,我必须使用
cURL
下载一个文件,然后再打开它,但问题是,当我在下载后试图打开文件时,它没有打开。我正在尝试打开一个
.exe
文件。下面是代码的一部分,负责文件下载

curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename.c_str(), "w");
        curl_easy_setopt(curl, CURLOPT_URL, links[index]);
        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);
    }
以及应打开下载文件的行:

ShellExecute(NULL, "open", fileToLaunch.c_str() , NULL, NULL, SW_HIDE);
当我尝试手动启动文件(通过单击它)时,
Windows
会返回一条错误消息,指出相应的应用程序不是
Win32
应用程序。我正在使用
Visual Studio 2017

下面是全部代码:

#include <stdio.h>
#include <curl/curl.h>
#include <curl/easy.h>
#include <string>
#include <iostream>
using namespace std;

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

int main(void) {
    CURL *curl;
    FILE *fp;
    CURLcode res;
    string url = "Here goes the url for file download";
    string outfilename = "C:\\1.exe";
    curl = curl_easy_init();
    if (curl) {
        fp = fopen(outfilename.c_str(), "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);
    }
    return 0;

    ShellExecute(NULL, "open", outfilename.c_str(), NULL, NULL, SW_HIDE);
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
大小写入数据(void*ptr、大小、大小nmemb、文件*流){
写入的大小=写入(ptr、大小、nmemb、流);
书面回报;
}
内部主(空){
卷曲*卷曲;
文件*fp;
卷曲编码;
string url=“这里是文件下载的url”;
字符串outfilename=“C:\\1.exe”;
curl=curl_easy_init();
if(curl){
fp=fopen(outfilename.c_str(),“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);
}
返回0;
ShellExecute(NULL,“open”,outfilename.c_str(),NULL,NULL,SW_HIDE);
}
更改

fp = fopen(outfilename.c_str(), "w");

默认情况下,您正在将其作为带有换行符翻译的文本写入磁盘。你需要把它写成二进制

有关更全面的解释,请参阅。

更改

fp = fopen(outfilename.c_str(), "w");

默认情况下,您正在将其作为带有换行符翻译的文本写入磁盘。你需要把它写成二进制


请参阅以获得更全面的解释。

首先,应删除这一行:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
因为
write_data
函数具有与cURL的
CURLOPT_WRITEDATA
相同的功能,因此,应该删除的那一行下面的行就足够了,其次,在首先满足
cURL_easy_setopt()
的行上:

curl_easy_setopt(curl, CURLOPT_URL, url);
您应该添加到
url
参数
.c_str()
,因此它将如下所示:

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
由于此函数无法使用字符串类型的数据进行操作


正如前面提到的,您必须在
fopen()
函数中将
'w'
更改为
'wb'
,因为您使用的是二进制数据流。

首先应删除这一行:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
因为
write_data
函数具有与cURL的
CURLOPT_WRITEDATA
相同的功能,因此,应该删除的那一行下面的行就足够了,其次,在首先满足
cURL_easy_setopt()
的行上:

curl_easy_setopt(curl, CURLOPT_URL, url);
您应该添加到
url
参数
.c_str()
,因此它将如下所示:

curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
由于此函数无法使用字符串类型的数据进行操作


正如
robk
所提到的,您必须在
fopen()
函数中将
'w'
更改为
'wb'
,因为您使用的是二进制数据流。

我也尝试了
wb
,但问题仍然存在,您可以添加一个,尤其是
write\u data()
的代码?调用
fopen()
而不使用“b”是您发布的代码中的一个明显缺陷。我添加了所需的示例。您是否查看了下载文件的内容以确保它符合您的预期,而不是其他内容,例如服务器错误页?我也尝试了
wb
,但是问题仍然存在,尤其是添加
write_data()
的代码?调用
fopen()
而不使用“b”是您发布的代码中的一个明显缺陷。我添加了所需的示例您是否查看了下载文件的内容以确保它是您所期望的,而不是其他内容,像服务器错误页面一样?
res
的值有意义吗?
res
的值有意义吗?