FileUtils getDataFromFile的一个问题小结

在配合rapidjson使用时,getDataFromFile有时返回的结果不太一样。

如果这样写:
auto data = FileUtils::getInstance()->getDataFromFile(filename);
rapidjson::Document doc;

doc.Parserapidjson::kParseDefaultFlags((const char*)data.getBytes());
有很大几率出错,因为最后一个字节可能不是0结尾,导致rapidjson解析错误。
注意:这里是有几率出现问题,不是总是出现问题,这是最可怕的。

这样写
auto data = FileUtils::getInstance()->getStringFromFile(filename);
rapidjson::Document doc;
doc.Parserapidjson::kParseDefaultFlags(data.c_str());
由于getStringFromFile创建了一个string对象,这样避免了这个问题。

仔细看来下代码,getDataFromFile调用的getData有两个参数,第二个参数决定是否使用string的方式读取。而getDataFromFile使用的是false(不使用string的方式读取)

static Data getData(const std::string& filename, bool forString)

使用API的还是要小心,由于没有仔细阅读getDataFromFile的API就贸然使用还是很危险的。

希望论坛里面多点楼主这样的小结…那我就轻松了:877::877:

你可能没有理解Data的含义,Data是二进制数据的封装,getDataFromFile支持解析二进制类型的文件为一个Data结构,二进制自然是不需要往数据结尾加上\0结束符的。
如果你用这个接口解析文本文件,拿到的自然也是整个文本文件的二进制数据,不包含字符串结束符\0。
还有,你用rapidjson的方式也是有错误的。
如果你用Data接口,就必须告诉rapidjson你data的长度,请使用rapidjson的这个接口:

    template <unsigned parseFlags>
    GenericDocument& Parse(const Ch* str, size_t length) {

length 就是这个事的。你可以把data.getSize()传入length这个参数嘛。。。

1赞

楼上终结此贴