C++ 相当于 Fortran 名单
C++ equivalent to Fortran Namelist
我的问题与C equivalent to Fortran namelist
几乎相同
主要区别在于我使用的是 C++/17,想知道是否有更符合 C++ 习惯的方式来解决这个问题。
在 C++ 中没有与 Fortran 的 Namelist 等效的东西。并且没有可移植的方法来实现这一点。
如果你想实现类似的构造,你需要一些通用的解析函数来处理 istream
上的行:
- 它会读取行并忽略
"!"
之后的任何内容;
- 它会读取第一个
"&"
后面的名字,看看它是否与预期的名字匹配;
- 一行中遇到唯一
"/"
会停止读取;
- 它会解析每一行in-between,找到一个包含变量名的字符串,
"="
,以及一个包含相等运算符右侧值的字符串,并存储std::map<std::string,std::string>
中的两个字符串。
对于临时阅读,您将调用解析函数将 istream
行转换为 map
。然后您将访问地图以初始化变量。一种简单而强大的方法是使用 stringstream sst(my_map["variable name"]); sst>>my_variable;
如果 Namelist 或多或少对应于 class
或 struct
X
,那么惯用法就是重载 friend istream& operator>> (istream&, X&);
。然后,这个重载的提取器将像 ad-hoc 的情况一样工作以初始化成员变量。
当然,我稍微简化了算法,因为您还需要处理输入文件中的错误:如果缺少预期变量,您会怎么做?如果读取的值与目标变量不兼容怎么办?
如果您要将 Fortran 代码迁移到 C++,并且必须使用 Namelist 来避免中断,这可能是一种可移植的方式。
但如果只是你的习惯,文件格式不是强制的,那么你可以考虑使用json,现有的众多库中的一个可以读写这种格式(22个库是列在链接页面上)。优点是你不必重新发明轮子,你可以与很多其他语言更好地互操作,而且 json 似乎更 future-proof。
我的问题与C equivalent to Fortran namelist
几乎相同主要区别在于我使用的是 C++/17,想知道是否有更符合 C++ 习惯的方式来解决这个问题。
在 C++ 中没有与 Fortran 的 Namelist 等效的东西。并且没有可移植的方法来实现这一点。
如果你想实现类似的构造,你需要一些通用的解析函数来处理 istream
上的行:
- 它会读取行并忽略
"!"
之后的任何内容; - 它会读取第一个
"&"
后面的名字,看看它是否与预期的名字匹配; - 一行中遇到唯一
"/"
会停止读取; - 它会解析每一行in-between,找到一个包含变量名的字符串,
"="
,以及一个包含相等运算符右侧值的字符串,并存储std::map<std::string,std::string>
中的两个字符串。
对于临时阅读,您将调用解析函数将 istream
行转换为 map
。然后您将访问地图以初始化变量。一种简单而强大的方法是使用 stringstream sst(my_map["variable name"]); sst>>my_variable;
如果 Namelist 或多或少对应于 class
或 struct
X
,那么惯用法就是重载 friend istream& operator>> (istream&, X&);
。然后,这个重载的提取器将像 ad-hoc 的情况一样工作以初始化成员变量。
当然,我稍微简化了算法,因为您还需要处理输入文件中的错误:如果缺少预期变量,您会怎么做?如果读取的值与目标变量不兼容怎么办?
如果您要将 Fortran 代码迁移到 C++,并且必须使用 Namelist 来避免中断,这可能是一种可移植的方式。
但如果只是你的习惯,文件格式不是强制的,那么你可以考虑使用json,现有的众多库中的一个可以读写这种格式(22个库是列在链接页面上)。优点是你不必重新发明轮子,你可以与很多其他语言更好地互操作,而且 json 似乎更 future-proof。