Я использую библиотеку cURL на С++ для выполнения HTTP-запросов. При сохранении результата в строке он отлично работает, однако результат выглядит следующим образом:
и это все одна непрерывная строка. Я хочу получить доступ к каждому обменному курсу и сохранить их в разных переменных, чтобы я мог производить с ними расчеты. Я попытался сохранить его в 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 (нотация объектов JavaScript). Чтобы сделать вашу жизнь намного проще, вы должны изучить использование библиотеки для обработки JSON в C++, такой как jsoncpp. Этот сайт здесь содержит краткое руководство.
Еще лучше, если вы сможете найти библиотеку JSON, которая поддерживает модель push, тогда обратный вызов CURLOPT_WRITEFUNCTION
может просто поместить необработанные байты в библиотеку как есть, а затем библиотека может запускать для вас свои собственные события, когда полные поля были проанализированы. , то вы можете сохранить эти поля по мере необходимости.
Спасибо! мне потребовалось несколько дней, чтобы заставить работать http-запросы. Не представляю, сколько времени это заняло бы! Я ценю помощь
Это данные JSON. Получите в свои руки библиотеку JSON и проанализируйте результат с ее помощью. Есть много. jsoncpp — один из примеров.