3

ポータブルなクロスプラットフォーム方式でFortran90のファイルをコピーするにはどうすればよいですか?

4

6 に答える 6

1

OSのコピーコマンドでSYSTEMを使用します。事実上、すべてのコンパイラがこの機能をサポートしています。

于 2011-03-02T15:00:50.203 に答える
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 に答える
0

はい、Fortranには哀れなI / Oがあり、可能であれば、この種のことには使用しないでください。私たちの何人かがそれをしなければならないのはなんと残念なことでしょう。

ソースファイルを読み取り、同時に宛先に1行ずつ書き込みます。これまでのところ、これは私にとってはうまくいきますが、非常に非効率的です。

ファイルと移植性の扱いはFortranにとって厄介であり、SYSTEM呼び出しもあまり良くないことがよくあります。Windows OSはLinuxにリンクされたファイルに正しく従わず、Windows / Linux / MacOSには異なるセパレーターがあり、SYSTEMコールに固有のスタック制限などに巻き込まれています。

幸運を !

于 2011-06-14T05:11:12.230 に答える
0

IntelFortranの場合

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

!Compaq / IntelVisualFortranの場合

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 に答える