c – 将pugixml的result.offset转换为column / line
作者:互联网
对于使用pugixml的应用程序,我需要用户友好的错误报告.
我目前正在使用result.offset.
有没有办法获得线和列?
我可能正在处理大型XML文件,如果这有所不同.
解决方法:
这个功能在pugixml中不容易获得,因为在每个解析上执行它都相对昂贵,并且在解析完成后,在一般情况下无法恢复文件/行信息.
这是一个构建偏移量的片段 – >您可以在解析失败时使用的行映射,或者出于其他原因需要该信息;随意调整文件I / O代码以满足您的要求.
typedef std::vector<ptrdiff_t> offset_data_t;
bool build_offset_data(offset_data_t& result, const char* file)
{
FILE* f = fopen(file, "rb");
if (!f) return false;
ptrdiff_t offset = 0;
char buffer[1024];
size_t size;
while ((size = fread(buffer, 1, sizeof(buffer), f)) > 0)
{
for (size_t i = 0; i < size; ++i)
if (buffer[i] == '\n')
result.push_back(offset + i);
offset += size;
}
fclose(f);
return true;
}
std::pair<int, int> get_location(const offset_data_t& data, ptrdiff_t offset)
{
offset_data_t::const_iterator it = std::lower_bound(data.begin(), data.end(), offset);
size_t index = it - data.begin();
return std::make_pair(1 + index, index == 0 ? offset + 1 : offset - data[index - 1]);
}
标签:pugixml,c,error-handling 来源: https://codeday.me/bug/20190831/1773684.html