如何在Fortran 90中复制文件?

时间:2011-03-02 14:58:43

标签: fortran fortran90

如何以便携式,跨平台的方式复制fortran 90中的文件?

6 个答案:

答案 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