如何以便携式,跨平台的方式复制fortran 90中的文件?
答案 0 :(得分:1)
将SYSTEM与操作系统的复制命令一起使用。几乎所有编译器都支持此功能。
答案 1 :(得分:1)
您可以通过Fortran 2003中的流读取/写入文件,但在Fortran 90/95中,我认为这可以复制任意文件(尽管效率极低!!)
OPEN(UNIT=ISRC, FILE='', ACCESS='DIRECT', STATUS='OLD', ACTION='READ', IOSTAT=IERR, RECL=1)
OPEN(UNIT=IDST, FILE='', ACCESS='DIRECT', STATUS='REPLACE', ACTION='WRITE', IOSTATE=IERR, RE)
IREC = 1
DO
READ(UNIT=ISRC, REC=IREC, IOSTAT=IERR) CHAR
IF (IERR.NE.0) EXIT
WRITE(UNIT=IDST, REC=I) CHAR
IREC = IREC + 1
END DO
当然,如果它是fortran生成的文件,您可以使用该信息使其更有效。
个人记录:如果你需要从fortran内部调用系统调用,你在做什么?使用其他更适合任务的语言不是更好吗?
答案 2 :(得分:0)
是的,Fortran有可怜的I / O,如果可能的话,不应该用于此类事情。很遗憾我们中的一些人被迫这样做。
我只是读取源文件并同时逐行写入目标。到目前为止,这对我有用,但效率很低。
使用Fortran处理文件和可移植性很烦人,而且SYSTEM调用通常也不是很好。 Windows操作系统没有正确地跟随linux链接文件,Windows / Linux / MacOS有不同的分隔符,我已经发现了SYSTEM调用中固有的堆栈限制,等等。
祝你好运!答案 3 :(得分:0)
对于英特尔Fortran
subroutine copy_file (file_name, file_name_new)
! copies a file file_name to file_name_new
! file_name and file_name_new must include the path information and may include wildcard characters
USE ifport
implicit character*100 (f)
character*1000 fnam
logical*4 logical_result
len1 = len_trim(file_name); len2 = len_trim(file_name_new)
fnam = 'copy/y ' //file_name(1:len1) //' '//file_name_new(1:len2)
l = len_trim(fnam)
logical_result = systemqq(fnam(1:l))
return
end
答案 4 :(得分:0)
之前的回答对我不起作用,所以我编写了以下子程序
!=============================================================================================================================!
! !
! This subroutine copies file_name to file_name_new writing command to cmd !
! !
!=============================================================================================================================!
subroutine copy_file (file_name, file_name_new)
use ifport
implicit none
!=============================================================================================================================
! D e c l a r a t i o n s
!=============================================================================================================================
character(len=*),intent(IN) :: file_name_new,file_name
!-----------------------------------------------------------------------------------------------------------------------------
logical :: logical_result
!=============================================================================================================================
! S t a t e m e n t s
!=============================================================================================================================
logical_result = systemqq('copy "'//trim(file_name) //'" "'//trim(file_name_new)//'"')
!==============================================================================================================================
end subroutine copy_file
答案 5 :(得分:0)
!对于Compaq / Intel Visual Fortran
subroutine copy_file(source_,dest_)
use kernel32,only:CopyFile,FALSE
implicit none
integer ret
character*(*), intent(in) :: source_, dest_
ret = CopyFile(trim(source_)//""C, trim(dest_)//""C, FALSE)
end subroutine copy_file