Необходимо сохранить результат http-запроса cURL в виде карты на С++

Я использую библиотеку cURL на С++ для выполнения HTTP-запросов. При сохранении результата в строке он отлично работает, однако результат выглядит следующим образом:

Необходимо сохранить результат http-запроса cURL в виде карты на С++

и это все одна непрерывная строка. Я хочу получить доступ к каждому обменному курсу и сохранить их в разных переменных, чтобы я мог производить с ними расчеты. Я попытался сохранить его в map вместо string, и он компилируется, но при запуске прерывается, и непонятно почему.

Код, вызывающий у меня проблемы, находится здесь:

#define CURL_STATICLIB

#include "curl/curl.h"

#include <iostream>
#include <string>
#include <map>


// change cURL library depending on debug or release config
#ifdef _DEBUG
#pragma comment(lib, "curl/libcurl_a_debug.lib")
#else
#pragma comment (lib, "curl/libcurl_a.lib")
#endif

// extra required libraries
#pragma comment (lib, "Normaliz.lib")
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Wldap32.lib")
#pragma comment (lib, "Crypt32.lib")
#pragma comment (lib, "advapi32.lib")

static size_t my_write(void* buffer, size_t size, size_t nmemb, void* param)
{
    std::string& text = *static_cast<std::string*>(param);
    size_t totalsize = size * nmemb;
    text.append(static_cast<char*>(buffer), totalsize);
    return totalsize;
}

int main()
{
    // create var to store result from request
    std::map<std::string, double> result;
    CURL* curl;
    CURLcode res;
    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    if (curl) {
        
        // determine the setup options for the request
        curl_easy_setopt(curl, CURLOPT_URL, "http://api.exchangeratesapi.io/v1/latest?access_key=9c6c5fc6ca81e2411e4058311eafdf3b&symbols=USD,GBP,AUD&format=1");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

        // perform the http request
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
        if (CURLE_OK != res) {
            std::cerr << "CURL error: " << res << '\n';
        }
    }
    curl_global_cleanup();
    std::map <std::string, double> ::const_iterator i;
    for (i = result.begin(); i != result.end(); i++)
    {
        std::cout << i->first << ": " << i->second;
    }
    
}

Чтобы сохранить его в строку, я заменяю:

std::map<std::string, double> result;

на std::string result;, а также заменить:

std::map <std::string, double> ::const_iterator i;
for (i = result.begin(); i != result.end(); i++)
{
    std::cout << i->first << ": " << i->second;
}

с std::cout << result << "\n\n";.

С этими заменами он работает нормально, но он просто не в том формате, в котором он мне нужен, если только нельзя извлечь определенные значения из строкового формата?

У меня такое ощущение, что то, что я пытаюсь сделать, очень специфично, и я изо всех сил пытался найти в Интернете что-нибудь, что могло бы мне помочь.

Это данные JSON. Получите в свои руки библиотеку JSON и проанализируйте результат с ее помощью. Есть много. jsoncpp — один из примеров.

paddy 21.03.2022 21:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы получаете файл JSON (нотация объектов JavaScript). Чтобы сделать вашу жизнь намного проще, вы должны изучить использование библиотеки для обработки JSON в C++, такой как jsoncpp. Этот сайт здесь содержит краткое руководство.

Еще лучше, если вы сможете найти библиотеку JSON, которая поддерживает модель push, тогда обратный вызов CURLOPT_WRITEFUNCTION может просто поместить необработанные байты в библиотеку как есть, а затем библиотека может запускать для вас свои собственные события, когда полные поля были проанализированы. , то вы можете сохранить эти поля по мере необходимости.

Remy Lebeau 21.03.2022 22:09

Спасибо! мне потребовалось несколько дней, чтобы заставить работать http-запросы. Не представляю, сколько времени это заняло бы! Я ценю помощь

SwillMith16 21.03.2022 23:07

Другие вопросы по теме