从libcurl下载的mp3文件损坏了

问题描述 投票:0回答:1

我正在使用libcurl访问IBM Watson API,我正在下载一个mp3文件,但下载的文件已经损坏。我期待着一个 "hello world "的消息,但我得到的不是损坏的mp3文件就是地狱的声音。我猜测这个错误是来自于我将响应转换为一个 const char * 而且它丢失了数据,因为我正在写二进制数据,而C++认为这个 null 关键字是字符串结束符。它输出了两个不同的字符串。有什么办法可以解决这个问题吗?

代码。

#include <iostream>
#include <fstream>
#include <string>
#include <curl/curl.h>
size_t CurlWrite_CallbackFunc_StdString(void *contents, size_t size, size_t nmemb, std::string *s)
{
    size_t newLength = size * nmemb;
    try
    {
        s->append((char*)contents, newLength);
    }
    catch (std::bad_alloc &e)
    {
        return 0;
    }
    return newLength;
}
std::string CurlGetResponse(std::string url) {
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_DEFAULT);

    curl = curl_easy_init();
    std::string response;

    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_USERNAME, "apikey");
        curl_easy_setopt(curl, CURLOPT_PASSWORD, "API Key");

        curl_easy_setopt(curl, CURLOPT_URL, url);

        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); //only for https
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); //only for https
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
        res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
                curl_easy_strerror(res));
        }
        curl_easy_cleanup(curl);
    }
    return response;
}
int main()
{
    std::string response = CurlGetResponse("url");
    std::cout << response.data();
    std::cout << response;
    std::fstream file;
    file.open("C:\\Users\\maste\\HelloWorld_1.mp3", std::ios::binary);
    file.write(response, sizeof(response));
    file.close();
    return 0;
}
c++ libcurl ibm-watson
1个回答
1
投票

语句

file.write(response, sizeof(response));

包含两个错误。

  1. 首先,它通过了 std::string 对象作为参数,但 write 期待一个指向要写入的字节的指针。你需要通过例如 response.data().

  2. 第二个问题(我在评论中也提到了)是 sizeof(response) 的大小。std::string 对象本身,而不是它所包含的字符串。你需要使用 response.size() 来获取实际字符串的大小。

总的来说,这个语句应该是这样的。

file.write(response.data(), response.size());
© www.soinside.com 2019 - 2024. All rights reserved.