3

如何以可移植的跨平台方式在 fortran 90 中复制文件?

4

6 回答 6

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 内部调用系统调用,您在做什么?使用更适合该任务的其他语言不是更好吗?

于 2011-03-03T21:59:09.173 回答
1

SYSTEM与操作系统的复制命令一起使用。几乎所有的编译器都支持这个特性。

于 2011-03-02T15:00:50.203 回答
0

是的,Fortran 有可悲的 I/O,如果可能的话,不应该用于这种事情。我们中的一些人被迫这样做真是太可惜了。

我只是读取源文件并同时逐行写入目标。到目前为止,这对我有用,但效率很低。

处理文件和可移植性对于 Fortran 来说很烦人,而且 SYSTEM 调用通常也不是很好。Windows 操作系统没有正确遵循 linux 链接文件,Windows/Linux/MacOS 有不同的分隔符,我被 SYSTEM 调用中固有的堆栈限制所困扰,等等。

祝你好运 !

于 2011-06-14T05:11:12.230 回答
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
于 2012-12-26T05:37:03.797 回答
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 
于 2016-09-15T15:57:57.730 回答
0

!对于康柏/英特尔 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
于 2017-08-01T08:26:06.337 回答