如何以可移植的跨平台方式在 fortran 90 中复制文件?
问问题
11419 次
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 回答