Bonjour à tous,
J’essaie actuellement d’implanter une fonction avec libcurl dont le seul et unique objectif est de télécharger un contenu JSON pour l’écrire dans un fichier.
Je me retrouve donc à mélanger C et C++ le temps de l’implémentation et à utiliser les fonctions de gestion de fichiers du langage C dont fopen
.
Or, je me retrouve avec un drôle de comportement de la part de cette fonction fopen
.
Voici le code :
size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream){
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
void HTTPDownloader::download(const char* url, const char* outputName){
FILE *file;
CURLcode res;
curl = curl_easy_init();
if(curl){
if((file = fopen(outputName, "w+"))){
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
res = curl_easy_perform(curl);
fclose(file);
}
else{
std::cout << "Failed to create/open the file " << outputName << std::endl;
}
}
}
void retrieveQueries(vector<pair<string, string>> qLoc){
for(auto It = qLoc.begin(); It != qLoc.end(); It++){
HTTPDownloader http;
http.download(It->first.c_str(), It->second.c_str());
}
}
Concernant It->first
et It->second
, ils contiennent respectivement un lien donnant accès à un query sur un serveur Prometheus et un nom de fichier dans lequel sera stocké le contenu JSON.
Dans cette configuration, le fichier ne s’ouvre pas ou n’est pas créé (sans le if
, c’est une erreur de segmentation au niveau de fclose
). En observant dans le débugger sous Qt Creator, file se retrouve avec un pointeur nul. Ce qui fait que le contenu du JSON ne peut pas être téléchargé.
En revanche, si j’initialise un array char contenant un random string comme ceci :
char outputName[FILENAME_MAX] = "data/swapfree.json";
…et que je le place dans la méthode download, alors fopen se comporte normalement en ouvrant/crééant le fichier avec en retour un pointeur non nul. Mais ce n’est malheureusement pas ce que je cherche à faire…
Que puis-je faire pour remédier à ce comportement ?
Merci d’avance !
EDIT: Il semble que je ne rencontre ce problème que sous QtCreator, en compilant et en faisant tourner le programme sur terminal (sous Manjaro), il s’exécute sans problème.
Terminal (Manjaro) : PASS
, QtCreator : FAIL