libcurl在write_data()函数处爆炸
libcurl explodes at write_data() function
如果curl查询满足验证要求,我将尝试将其内容写入文件。我的代码编译没有错误,但在执行时我收到以下错误->
cryptsy # ./foundGetPrice2.o|wgetpaste
foundGetPrice2.o: rapidjson/include/rapidjson/document.h:911: rapidjson::GenericValue<Encoding, Allocator>::MemberIterator rapidjson::GenericValue<Encoding, Allocator>::FindMember(const rapidjson::GenericValue<Encoding, SourceAllocator>&) [with SourceAllocator = rapidjson::MemoryPoolAllocator<>; Encoding = rapidjson::UTF8<>; Allocator = rapidjson::MemoryPoolAllocator<>; rapidjson::GenericValue<Encoding, Allocator>::MemberIterator = rapidjson::GenericMemberIterator<false, rapidjson::UTF8<>, rapidjson::MemoryPoolAllocator<> >]: Assertion `IsObject()' failed.
Your paste can be seen here: https://bpaste.net/show/768ea25c86d5
在我的代码的第42行,您可能会注意到curl的2行写操作被注释掉了。如果我从那里写_data(),它是有效的,但没有验证,所以它对我没有好处。
#include "rapidjson/include/rapidjson/document.h"
#include "rapidjson/include/rapidjson/rapidjson.h"
#include "rapidjson/include/rapidjson/writer.h"
#include <cstdio>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <curl/curl.h>
#include <unistd.h>
using namespace rapidjson;
struct myData
{
std::fstream *file;
std::string *str;
};
size_t write_data(void *ptr, size_t size, size_t nmemb, myData *data)
{
size_t numBytes = size * nmemb;
if (data->file)
data->file->write((char*)ptr, numBytes);
if (data->str)
*data->str += std::string((char*)ptr, numBytes);
return numBytes;
}
std::string tradeData;
int getData()
{
int count = 0;
//begin non terminating loop
while(true)
{
count++;
CURL *curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid=155");
std::fstream file("myfile.txt", std::ios_base::out | std::ios_base::ate);
std::string json;
myData data;
data.file = &file;
data.str = &json;
//curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
//curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_data);
CURLcode res = curl_easy_perform(curl);
if (res != CURLE_OK)
{
std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << std::endl;
}
else
{
file << std::endl;
Document document;
document.Parse(json.c_str());
std::string tradeUpdate = document["return"]["markets"]["DRK"]["lasttradeprice"].GetString();
if (tradeUpdate > tradeData){
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_data);
std::cout << std::endl;
}
else{
std::cout << "There was an error! " << tradeData << std::endl;
}
}
/* always cleanup */
curl_easy_cleanup(curl);
}
usleep(10000000);
}
return 0;
}
//Le Main
int main(void)
{
getData();
}
gdb输出:
gdb-bt输出的bpaste
如何在验证后正确写入来自libcURL请求的数据?
由于rapidjson
中以下行的断言,程序崩溃:
std::string tradeUpdate = document["return"]["markets"]["DRK"]["lasttradeprice"].GetString();
实际上,在第42行和第43行注释的情况下,您从未将任何内容分配给std::string json
,因此它保持为空,因此document
也是空的。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- BLE gattServer.write()重载函数
- 使用 insertion(<<) 运算符和 "write" 函数在 C++ 中显示数据有什么区别?
- 如何使用write()函数将结构写入文件
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 仅在我退出应用程序后,使用Cout.write()函数在控制台上打印字符串
- 为什么即使对于 "copy on write" 的 const 成员函数也返回一个代理类?
- 瓦尔格林德给出"Invalid write of size 8"空析构函数
- 为什么在 C++ 的 write() 函数中使用 (char *)
- 在Linux上使用C/C++中的write()函数通过UART Beaglebone Black写入70kB
- 像 read() 、write() 这样的函数调用在 Linux 中是实际的系统调用吗?
- 当发生错误(拒绝访问)时调用Curl-headerfunction和write函数
- 我应该使用什么c++ Write函数
- 为什么使用write函数而不是整数将奇怪的符号写入二进制文件
- 为什么函数'x'.write(frame)对我不起作用?
- 等效于 VB DLL 函数声明的 C# 返回并返回'Attempted to read or write protected memory'错误
- 没有匹配的函数调用 std::basic_ofstream<char>::write()