这是我的第一个问题:
我正在尝试从NetCDF文件(使用C++旧版API)读取“全局属性”。 “全局属性”是指添加到NcFile而不是NcVar的属性。
在大多数情况下,“Example netCDF programs”很有用-但没有“全局属性”的示例。
咨询“netcdfcpp.h”,我发现一些事情:
NcAtt* get_att(NcToken) const;
friend class NcFile;
NcAtt( NcFile*, NcToken);
NcValues* values( void ) const;
ncvalues.h
header 我的编码技能不足以理解如何在NcFile中的NcAtt类中重新获得存储为NcValue的字符串/整数/浮点数。
随附的是我的问题“NetCDF_test.cpp”的示例代码,“LoadNetCDF”功能的实现缺少关键部分。
代码使用以下命令编译OK:(编辑:此外,“TestFile.nc”已正确创建)
g++ -c NetCDF_test.cpp -o NetCDF_test.o
g++ -o NCTEST NetCDF_test.o -lnetcdf_c++ -lnetcdf
示例代码:
#include <iostream> // provides screen output (i.e. std::cout<<)
#include <netcdfcpp.h>
struct MyStructure {
std::string MyString;
int MyInt;
float MyFloat;
MyStructure(); // default constructor
int SaveNetCDF(std::string); // Save the struct content to "global attributes" in NetCDF
int LoadNetCDF(std::string); // Load the struct content from "global attributes" in NetCDF
};
MyStructure::MyStructure(void)
{
MyString = "TestString";
MyInt = 123;
MyFloat = 1.23;
}
int MyStructure::SaveNetCDF(std::string OUTPUT_FILENAME)
{
NcError err(NcError::silent_nonfatal);
static const int NC_ERR = 2;
NcFile NetCDF_File(OUTPUT_FILENAME.c_str(), NcFile::Replace);
if(!NetCDF_File.is_valid()) {return NC_ERR;}
if(!(NetCDF_File.add_att("MyString",MyString.c_str()))) {return NC_ERR;}
if(!(NetCDF_File.add_att("MyInt",MyInt))) {return NC_ERR;}
if(!(NetCDF_File.add_att("MyFloat",MyFloat))) {return NC_ERR;}
return 0;
}
int MyStructure::LoadNetCDF(std::string INPUT_FILENAME)
{
NcError err(NcError::silent_nonfatal);
static const int NC_ERR = 2;
NcFile NetCDF_File(INPUT_FILENAME.c_str(), NcFile::ReadOnly);
if(!NetCDF_File.is_valid()) {return NC_ERR;}
// ???? This is where I am stuck.
// How do I read the global attribute from the NetCDF_File ??
return 0;
}
int main()
{
std::cout<< "START OF TEST.\n";
MyStructure StructureInstance; // datamembers initialized by constructor
StructureInstance.SaveNetCDF("TestFile.nc");
StructureInstance.MyString = "Change string for sake of testing";
StructureInstance.MyInt = -987;
StructureInstance.MyFloat = -9.87;
StructureInstance.LoadNetCDF("TestFile.nc"); // data members are supposed to be read from file
std::cout<< "Now the data members of StructureInstance should be TestString, 123, and 1.23\n";
std::cout<< StructureInstance.MyString << " ; " << StructureInstance.MyInt << " ; " << StructureInstance.MyFloat <<"\n";
std::cout<< "END OF TEST.\n";
}
最佳答案
在C++用户指南中很清楚地阐明了这一点:http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-cxx/Class-NcAtt.html#Class-NcAtt
“由于属性仅与打开的netCDF文件相关联,因此此类没有公共(public)构造函数。请使用NcFile和NcVar的成员函数来获取netCDF属性或添加新属性。”
全局属性是文件上的属性(与变量属性相对,变量属性是变量上的属性)
NetCDF_File.num_atts()返回多少个全局属性。 get_att()方法(以各种方式重载)将为您提供一个属性。
咨询http://www.unidata.ucar.edu/software/netcdf/docs/netcdf-cxx/Class-NcFile.html#Class-NcFile
关于c++ - 如何在C++中读取NetCDF “global attribute”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27987962/