C equivalent to Fortran namelist
c, file-io, fortran, fortran-iso-c-binding, variables
Solution
Here is a simple example that will let you read Fortran namelists from C. I used the namelist file that you provided in the question, `input.txt`.
Fortran subroutine `nmlread_f.f90` (notice the use of `ISO_C_BINDING`):
subroutine namelistRead(n,m,l) bind(c,name='namelistRead')
use,intrinsic :: iso_c_binding,only:c_float,c_int
implicit none
real(kind=c_float), intent(inout) :: n
real(kind=c_float), intent(inout) :: m
integer(kind=c_int),intent(inout) :: l
namelist /inputDataList/ n,m,l
open(unit=100,file='input.txt',status='old')
read(unit=100,nml=inputDataList)
close(unit=100)
write(*,*)'Fortran procedure has n,m,l:',n,m,l
endsubroutine namelistRead
C program, `nmlread_c.c`:
#include <stdio.h>
void namelistRead(float *n, float *m, int *l);
int main()
{
float n;
float m;
int l;
n = 0;
m = 0;
l = 0;
printf("%5.1f %5.1f %3d\n",n,m,l);
namelistRead(&n,&m,&l);
printf("%5.1f %5.1f %3d\n",n,m,l);
}
Also notice that `n`,`m` and `l` need to be declared as pointers in order to pass them by reference to the Fortran routine.
On my system I compile it with Intel suite of compilers (my gcc and gfortran are years old, don't ask):
ifort -c nmlread_f.f90
icc -c nmlread_c.c
icc nmlread_c.o nmlread_f.o /usr/local/intel/composerxe-2011.2.137/compiler/lib/intel64/libifcore.a
Executing `a.out` produces the expected output:
0.0 0.0 0
Fortran procedure has n,m,l: 1000.000 1000.000 -2
1000.0 1000.0 -2
You can edit the above Fortran procedure to make it more general, e.g. to specify namelist file name and list name from the C program.
Problem
I am used to Fortran in which I used the namelist sequential read in to get variables out of a file. This allows me to have a file which looks like this ``` &inputDataList n = 1000.0 ! This is the first variable m = 1e3 ! Second l = -2 ! Last variable / ``` where I can name the variable by it's name and assign a value as well as comment afterwards to state what the variable actually is. The loading is done extremely easy by ``` namelist /inputDataList/ n, m, l open( 100, file = 'input.txt' ) read( unit = 100, nml = inputDataList ) close( 100 ) ``` Now my question is, is there any similar thing in C? Or would I have to do it manually by chopping the string at the '=' and so on?