В C ++ нет эквивалента Имени Фортрана . И нет никакого портативного способа достигнуть этого.
Если вы хотите получить аналогичную конструкцию, вам понадобится некоторая общая функция синтаксического анализа, работающая со строками в istream
:
- Он будет читать строки и игнорировать все, что следует за
"!"
;
- Будет прочитано имя, которое следует за первым
"&"
, чтобы увидеть, соответствует ли оно ожидаемому имени;
- Прекратит чтение при обнаружении подошвы
"/"
на линии;
- Он будет анализировать каждую промежуточную строку, находя строку с именем переменной
"="
и строку со значением справа от оператора равенства, и сохранять эти две строки в std::map<std::string,std::string>
.
Для специального чтения вы должны вызвать функцию синтаксического анализа для преобразования istream
строк в map
. Затем вы получите доступ к карте для инициализации переменных. Простой и эффективный способ - использовать stringstream sst(my_map["variable name"]); sst>>my_variable;
Если список имен будет более или менее соответствовать class
или struct
X
, тогда идиома будет заключаться в перегрузке friend istream& operator>> (istream&, X&);
. Затем этот перегруженный экстрактор будет работать как в специальном случае для инициализации переменных-членов.
Конечно, я несколько упрощаю алгоритм, так как вам также придется справляться с ошибками во входном файле: что вы будете делать, если ожидаемая переменная отсутствует? что делать, если прочитанное значение несовместимо с целевой переменной?
Если вы переносите код с Фортрана на C ++ и вам необходимо использовать Namelist, чтобы избежать сбоев, это может быть переносимым способом продвижения вперед.
Но если это просто ваша привычка, а формат файла не является обязательным, то вы можете рассмотреть возможность использования json с одной из множества существующих библиотек для чтения и записи этого формата (22 библиотеки перечислены на связанной странице). Преимущество в том, что вам не нужно изобретать велосипед, вы будете более совместимы с множеством других языков, а json кажется более перспективным.