HTML forráskód olvasása változóba CURL-lel [C++]

HTML forráskód olvasása változóba CURL-lel [C++]
2014-02-16T11:54:46+01:00
2014-02-16T12:41:36+01:00
2022-11-30T13:25:39+01:00
Relative
Sziasztok!

Egy interneten (webszerveren) lévő file tartalmát szeretném wchar_t* változóba olvastatni. Ebben kérem a segítségeteket.

Találtam egy egyszerűnek tűnő megoldást, ami LibCURL-t használ. Az alábbi egyszerű kódot ajánlja a HTML forráskódok tartalmának kiolvasására:
#include <stdio.h> #include <curl/curl.h> int main(void){ CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://www.mrhow.eu/_dl/text.dat"); /* example.com is redirected, so we tell libcurl to follow redirection */ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); /* always cleanup */ curl_easy_cleanup(curl); } return 0; }
A kód működik, lefut hiba nélkül. De hová kerül a text.dat file tartalma? Hogy tegyem bele egy wchar_t* változóba?

Relative
Mutasd a teljes hozzászólást!
Két dolog:
1. A curl alapesetben a standard kimenetre írja az adatokat. Ha máshová szeretnéd kapni, regisztrálnod kell egy callback függvényt, amit a curl majd meghívogat a kapott adatokkal.
2. A curl nem foglalkozik karakterkódolással. char* típusú sztring mutatókat fogsz kapni, a wchar_t-re való konverziót neked kell megoldanod.

A probléma második felében nem tudok segíteni, nem emlékszem milyen karakter-konverziós opciók vannak C++-ban, de az első feléhez elvileg ennyi elég:

#include <stdio.h> #include <string> #include <curl/curl.h> extern "C" size_t append_chunk(char *ptr, size_t size, size_t nmemb, void *userdata) { std::string *target = (std::string*)userdata; target->append(ptr, size*nmemb); return size*nmemb; } int main(void){ CURL *curl; CURLcode res; curl = curl_easy_init(); std::string page_markup; if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://www.mrhow.eu/_dl/text.dat"); /* example.com is redirected, so we tell libcurl to follow redirection */ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, append_chunk); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page_markup); /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); /* always cleanup */ curl_easy_cleanup(curl); } return 0; }
Így a sikeres hívás után a page_markup változóban lesz az oldal forrása.
Mutasd a teljes hozzászólást!

  • Ahonnan belinkelted a példát, ott keresd meg a "get a remote file in memory" példát (oldal tetején az example source codes link alatt)...
    Mutasd a teljes hozzászólást!
  • Két dolog:
    1. A curl alapesetben a standard kimenetre írja az adatokat. Ha máshová szeretnéd kapni, regisztrálnod kell egy callback függvényt, amit a curl majd meghívogat a kapott adatokkal.
    2. A curl nem foglalkozik karakterkódolással. char* típusú sztring mutatókat fogsz kapni, a wchar_t-re való konverziót neked kell megoldanod.

    A probléma második felében nem tudok segíteni, nem emlékszem milyen karakter-konverziós opciók vannak C++-ban, de az első feléhez elvileg ennyi elég:

    #include <stdio.h> #include <string> #include <curl/curl.h> extern "C" size_t append_chunk(char *ptr, size_t size, size_t nmemb, void *userdata) { std::string *target = (std::string*)userdata; target->append(ptr, size*nmemb); return size*nmemb; } int main(void){ CURL *curl; CURLcode res; curl = curl_easy_init(); std::string page_markup; if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://www.mrhow.eu/_dl/text.dat"); /* example.com is redirected, so we tell libcurl to follow redirection */ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, append_chunk); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &page_markup); /* Perform the request, res will get the return code */ res = curl_easy_perform(curl); /* Check for errors */ if(res != CURLE_OK) fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res)); /* always cleanup */ curl_easy_cleanup(curl); } return 0; }
    Így a sikeres hívás után a page_markup változóban lesz az oldal forrása.
    Mutasd a teljes hozzászólást!
  • Igen, ez jól működik. Lefut szépen, hiba nélkül a kód. Köszönöm szépen Csaboka2.

    A char* -> wchar_t konverziót megoldottam.

    (Most már csak azt nem tudom, hogy a DLL file-omat miért nem tudja meghívni egy másik programom...)

    Árnyék, köszi neked is a segítséget.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd