版本:NetCDF-C 4.2
问题:直接读取不存在的变量或属性,程序崩溃
解决:
读取之前,先判断变量/属性是否存在,没有直接的判断函数,通过读取所有的属性/变量到内存中,然后再判断。
NcVar pVar = m_pDataFile->getVar("salt");
if (pVar.isNull())
return false;
std::map<std::string, NcVarAtt> map_atts = pVar.getAtts();//获取所有的属性,因为获取不存在的属性会崩溃
//查看压缩值
float fscale = 1.0f;
float foffset = 0.0f;
if (map_atts.find("scale_factor") != map_atts.end())
{
NcVarAtt AttT = pVar.getAtt("scale_factor");
if (!AttT.isNull())
{
NcType TypeId = AttT.getType();
if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)
AttT.getValues(&fscale);
}
}
//查看偏移值
if (map_atts.find("add_offset") != map_atts.end())
{
NcVarAtt AttS = pVar.getAtt("add_offset");
if (!AttS.isNull())
{
NcType TypeId = AttS.getType();
if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE)
AttS.getValues(&foffset);
}
}
//默认填充值
float fFillVaue = 0.0f;
if (map_atts.find("_FillValue") != map_atts.end())
{
NcVarAtt AttF = pVar.getAtt("_FillValue");
if (!AttF.isNull())
{
NcType TypeId = AttF.getType();
if (TypeId == NC_FLOAT || TypeId == NC_DOUBLE || TypeId == NC_SHORT)
AttF.getValues(&fFillVaue);
}
}