这是我的第一个问题:

我正在尝试从NetCDF文件(使用C++旧版API)读取“全局属性”。 “全局属性”是指添加到NcFile而不是NcVar的属性。

在大多数情况下,“Example netCDF programs”很有用-但没有“全局属性”的示例。

咨询“netcdfcpp.h”,我发现一些事情:

  • NcFile具有成员函数:NcAtt* get_att(NcToken) const;
  • NcAtt没有公共(public)构造函数
  • NcAtt是NcFile的 friend :friend class NcFile;
  • NcAtt有一个私有(private)构造函数:NcAtt( NcFile*, NcToken);
  • NcAtt具有公共(public)成员函数NcValues* values( void ) const;
  • NcValues具有通过ncvalues.h header
  • 定义的API

    我的编码技能不足以理解如何在NcFile中的NcAtt类中重新获得存储为NcValue的字符串/整数/浮点数。

    随附的是我的问题“NetCDF_test.cpp”的示例代码,“LoadNetCDF”功能的实现缺少关键部分。

    代码使用以下命令编译OK:(编辑:此外,“TestFile.nc”已正确创建)
    g++ -c NetCDF_test.cpp -o NetCDF_test.og++ -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/

    10-09 06:14