String 用Fortran解析字符串

String 用Fortran解析字符串,string,parsing,file-io,fortran90,String,Parsing,File Io,Fortran90,我正在读Fortran中的一个文件,它的每一行上都有数量不确定的浮点值(目前,一行上大约有17个值)。我想把每行上的第n个值读入给定的浮点变量。我该怎么做呢 在C语言中,我编写它的方式是读取字符串上的整行内容,然后执行如下操作: for(int il = 0; il < l; il++) { for(int im = -il; im <= il; im++) pch = strtok(NULL, "\t "); } for(int im = -l; im &l

我正在读Fortran中的一个文件,它的每一行上都有数量不确定的浮点值(目前,一行上大约有17个值)。我想把每行上的第n个值读入给定的浮点变量。我该怎么做呢

在C语言中,我编写它的方式是读取字符串上的整行内容,然后执行如下操作:

for(int il = 0; il < l; il++)
{
    for(int im = -il; im <= il; im++)
        pch = strtok(NULL, "\t ");
}
for(int im = -l; im <= m; im++)
    pch = strtok(NULL, "\t ");
dval = atof(pch);
for(int-il=0;il对于(int im=-il;im而言,问题在于Fortran是基于记录的I/O系统,而C是基于流的

如果您可以访问符合Fortran 2003的编译器(gfortran的现代版本应该可以工作),则可以使用
访问
说明符来执行您想要的操作

可以找到一个例子

当然,如果你真的愿意,你可以直接从Fortran中使用你的C函数。连接这两种语言通常很简单,通常只需要一个带有小写名称和附加下划线的包装器(当然取决于编译器和平台).通常,来回传递数组或字符串并不是那么简单;但对于本例,不需要这样做

一旦数据进入字符数组,就可以像处理
ADVANCE=no
签名一样将其读入另一个变量,即

do i = 1, numberIWant
   read(tline, '(F10.15)', ADVANCE="no") tline1
end do
其中,
t行
应在循环末尾包含您的号码


由于基于记录的I/O,一个
READ
语句通常会抛出记录结束后的内容。但是
ADVANCE=no
告诉它不要这样做。

如果您确切地知道所需值的起始位置,您可以使用
T
编辑描述符从该位置开始下一次读取。
例如,假设每个字段的宽度为10个字符,您希望读取第五个值

read(file_unit, '(t41, f10.5)') value1
注意:您可以在运行时使用字符变量作为格式,并使用内部文件写入来输入此数字,从而动态创建格式字符串,格式字符串在
t
后面有正确的数字。
假设您想要从位置
n
开始的值,它将如下所示(我交替使用单引号和双引号,以使每个字符串的开始和停止位置更加清晰):


肯定已经有一些库可以为您这样做了?不需要再发明轮子。我知道我可以用流访问打开文件,但我正在尝试从字符串读取这些值。有没有办法将字符串视为流?您发布了您正在从文件读取数据--数据如何从文件到字符串?您不能读取吗您只需要从文件中读取所需内容,还是在某些时候需要整个内容而只需要部分内容?使用advance=说明符读取内部文件是不符合标准的。这是事实;实现这一点的首选方法是只从文件中读取所需内容,而不是取出整个内容并取出需要的内容迪德。
write(my_format, '(a, i0, a)') "(t", n, ', f10.5)'
read(file_unit, my_format) value1