String 用Fortran解析字符串
我正在读Fortran中的一个文件,它的每一行上都有数量不确定的浮点值(目前,一行上大约有17个值)。我想把每行上的第n个值读入给定的浮点变量。我该怎么做呢 在C语言中,我编写它的方式是读取字符串上的整行内容,然后执行如下操作: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
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