相当于Fortran列表的C ++

时间:2019-05-18 11:51:20

标签: c++ data-structures file-io fortran dataformat

我的问题与C equivalent to Fortran namelist完全相同

主要区别在于我使用的是C ++ / 17,想知道是否还有其他C ++惯用的方式来解决问题。

1 个答案:

答案 0 :(得分:1)

在C ++中没有等效于Fortran的Namelist。而且没有便携式的方法可以实现这一目标。

如果要实现类似的构造,则需要一些常规的解析函数,这些函数使用istream上的行:

  • 它将读取行并忽略"!"之后的所有内容;
  • 它将读取第一个"&"之后的名称,以查看其是否与预期名称匹配;
  • 当在一行中遇到唯一的"/"时,它将停止阅读;
  • 它将解析中间的每一行,找到一个变量名称为"="的字符串以及一个等于操作符右侧值的字符串,并将这两个字符串存储在std::map<std::string,std::string>

对于临时读取,您可以调用解析函数将istream行转换为map。然后,您将访问映射以初始化变量。一种简单而有效的方法是使用stringstream sst(my_map["variable name"]); sst>>my_variable;

如果名称列表或多或少地对应于classstruct X,那么习惯用法就是重载friend istream& operator>> (istream&, X&);。然后,此重载的提取器将像在临时情况下一样工作以初始化成员变量。

当然,我会简化算法,因为您还需要处理输入文件中的错误:如果缺少预期变量该怎么办?如果读取的值与目标变量不兼容怎么办?

如果要将Fortran代码迁移到C ++,并且必须使用“名称列表”以避免中断,则这可能是一种可移植的前进方式。

但是,如果这只是您的习惯,并且文件格式不是强制性的,那么您可以考虑使用json,并拥有许多可读写此格式的库(其中列出了22个库)链接的页面)。优点是您不必重新发明轮子,可以与许多其他语言互操作,并且json似乎更适合未来。