Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在fortran中读取浮点并修改基于变量的文件:正确格式_String_Format_Fortran_Fortran90 - Fatal编程技术网

String 在fortran中读取浮点并修改基于变量的文件:正确格式

String 在fortran中读取浮点并修改基于变量的文件:正确格式,string,format,fortran,fortran90,String,Format,Fortran,Fortran90,我试图编写一个代码,在其中读取一个变量(Delta),并基于此,我试图将相应的文件(TESTDIR/Delta0.5_DOS\u 2D_TBM.dataDOS.dataforDelta=0.5)复制到当前目录 Program Modify_variable_based_file character(LEN=100):: command character(LEN=10):: chDelta real*8:: Delta

我试图编写一个代码,在其中读取一个变量(
Delta
),并基于此,我试图将相应的文件(
TESTDIR/Delta0.5_DOS\u 2D_TBM.data
DOS.data
for
Delta=0.5
)复制到当前目录

        Program Modify_variable_based_file
        character(LEN=100):: command
        character(LEN=10):: chDelta
        real*8:: Delta

        Print*,'Enter Delta'
        Read*,Delta

        write(chDelta,'(f0.1)') Delta
        print*,'chDelta=',chDelta,' Delta=',Delta

        command='cp TESTDIR/Delta' // trim(adjustl(chDelta)) //'_DOS_2D_TBM.data DOS.data'
        call system(command)

        End Program Modify_variable_based_file
但是,当我输入
Delta
时,我可以看到
chDelta
.5
而不是
0.5
。 你能告诉我正确的格式吗?有没有其他方法可以避免字符串转换


请注意,在这里,我的文件是用小数点左边有最高有效位的数字命名的,即,如果它
Delta
1.5
,则文件是
Delta1.5\u DOS\u 2D\u TBM.data
。只有当没有其他有效数字时,小数点前才会出现零。

如果小数点后只需要一个数字,可以使用f20.1等

character(LEN=100) :: chDelta    !! use a sufficiently large buffer

write( chDelta,'(f20.1)' ) Delta
chDelta = adjustL( chDelta )
然后,与Delta=0.5对应的chDelta变为“0.5”(注意adjustL()删除0之前的所有空格)。同样,您可以使用格式保留4位数字

write( chDelta,'(f20.4)' ) Delta
这使得chDelta=“0.5000”。为了在小数点后获得灵活的非零位数,我们可能需要手动删除不必要的零。例如,可以通过搜索最后一个非零数字并删除尾随的零来实现

real*8 x( 5 )
character(100) str

x(:) = [ 1.0d0, 0.2d0, 1.23d0, -123.456d0, 123.678901d0 ]

do i = 1, 5
    write( str, "(f20.4)" ) x(i)
    call truncate( str, 4 )
    print *, "file", trim(str), ".dat"
enddo
...

subroutine truncate( str, dmax )
    implicit none
    character(*), intent(inout) :: str
    integer,      intent(in)    :: dmax   !! maximum number of nonzero digits
    integer :: dot, k, last

    str = adjustL( str )
    dot = index( str, '.' )

    do k = dot + dmax, dot, -1
        if ( str( k:k ) /= '0' ) then
            last = k
            exit
        endif
    enddo
    if ( last == dot ) last = last + 1   !! retain at least one digit

    str = str( 1:last )
end
然后输出变为

file1.0.dat
file0.2.dat
file1.23.dat
file-123.456.dat
file123.6789.dat

因此,当
Delta
为0.5时,您希望
chDelta
为“0.5”?将0.5作为字符串(chDelta)读取并在必要时使用内部文件从chDelta读取Delta不是更简单吗?@Ross,是的,我希望如此@roygvib,不,这是不可能的,有大量文件是通过在变量上运行循环生成的,
0.5
是一个典型的例子。所以你的问题实际上是:?我很困惑。如果delta是real类型(p.s.real*8不是Fortran),你怎么能期望区分0.25和00.25,实际上是0.250和00.250,因为对于实数,它们都是一样的?谢谢@roygvib,实际上
adjustl
已经存在于
命令中,所以我可能不需要这样做,但是
f20.1
绝对是
0.5
的正确格式。您还提供了一个非常通用的解决方案,非常有用。:)很好,如果它工作:)虽然我也尝试了G格式,但它也不工作(例如,g0.1给出了0.5的“.5”)。所以转换有点尴尬。。。干杯