ポータブルなクロスプラットフォーム方式でFortran90のファイルをコピーするにはどうすればよいですか?
6 に答える
OSのコピーコマンドでSYSTEMを使用します。事実上、すべてのコンパイラがこの機能をサポートしています。
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内からシステムコールを呼び出す必要がある場合、何をしていますか?タスクにより適した他の言語を使用する方が良いのではないでしょうか。
はい、Fortranには哀れなI / Oがあり、可能であれば、この種のことには使用しないでください。私たちの何人かがそれをしなければならないのはなんと残念なことでしょう。
ソースファイルを読み取り、同時に宛先に1行ずつ書き込みます。これまでのところ、これは私にとってはうまくいきますが、非常に非効率的です。
ファイルと移植性の扱いはFortranにとって厄介であり、SYSTEM呼び出しもあまり良くないことがよくあります。Windows OSはLinuxにリンクされたファイルに正しく従わず、Windows / Linux / MacOSには異なるセパレーターがあり、SYSTEMコールに固有のスタック制限などに巻き込まれています。
幸運を !
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
前の答えは私にはうまくいかなかったので、私は次のサブルーチンを書きました
!=============================================================================================================================!
! !
! 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
!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