2017-09-23 1 views
0

파일을 추가하기 전에 파일을 삭제할 수 있습니까?기존 파일을 덮어 쓰고 추가하여 Fortran에 추가하십시오.

OPEN(61,file="file.txt",action='write',position='append') 
    WRITE(61,*)f(i,j) 
    CLOSE(61) 

이렇게하면 file.txt가 만들어지고 f (i, j) 값이 추가됩니다. 전체 설정은 내부 루프입니다. 그러나 다음에 동일한 코드를 실행하면 이전에 작성한 마지막 값부터 추가되기 시작합니다. 파일 내용을 실행할 때마다 데이터를 추가하기 전에 파일 내용을 완전히 제거하고 싶었습니다. 가능한가? 첫 번째 실행에서

program test 
    double precision f 
    dimension f(10,10,10) 
    integer i,j,k 
    character*500 ofile 
    Do k=1,5 
    do i=1,2 
    do j=1,2 
    f(i,j,k)= i+10d0*j+k 
    WRITE(ofile,'(A,F4.2,A,F4.2,A)')'file',i*1d0,'_',j*1d0,'.dat' 
    OPEN(61,file=ofile,action='write',position='append') 
    WRITE(61,*)k,f(i,j,k) 
    enddo 
    enddo 
    enddo 
    CLOSE(61) 
    stop 
    end 

출력 cat file1.00_1.00.dat이다 : 제 안목

 1 12.000000000000000 
     2 13.000000000000000 
     3 14.000000000000000 
     4 15.000000000000000 
     5 16.000000000000000 

다시 cat file1.00_1.00.dat 마지막에 부가 시작 : 여기

한 간단한 테스트 프로그램

 1 12.000000000000000  
     2 13.000000000000000  
     3 14.000000000000000  
     4 15.000000000000000  
     5 16.000000000000000  
     1 12.000000000000000  
     2 13.000000000000000  
     3 14.000000000000000  
     4 15.000000000000000  
     5 16.000000000000000 

나는 두 번째 경우를 피하고자합니다. 내가 도망 매번, 그것은 실행하기 전에 파일을 삭제하지 않고

 1 12.000000000000000 
     2 13.000000000000000 
     3 14.000000000000000 
     4 15.000000000000000 
     5 16.000000000000000 

주의를 주어야한다 : 나는 내부 루프 구문을 함께 형식의 파일 이름으로 루프를 수행하여 파일을 열 수 있습니다. 하나의 쉬운 솔루션은 실행하기 전에 매번 모든 출력 파일을 제거하는 것입니다.

+0

_replace_를 의미합니까? 그러나 당신은 또한 처음부터 자리를 잡을 수 있습니다. 그래서 당신이'append '를 선택할 필요가있는 이유가 있습니까? – francescalus

+2

그냥'position = 'append''를 제거합니다. 기본값은 덮어 쓰기입니다. – agentp

+0

@francescalus 추가 이유는 do 루프 i, j가 계속 진행될 때 동일한 파일에 모든 f (i, j)를 쓰는 것입니다. 기본적으로 나는 코드를 멈추고 다시 실행하기를 원한다. –

답변

1

다른 사용자와의 모든 토론을 마친 후, 나는 (언급 한대로) 여기에있는 내용을 지나치게 복잡하게 만들고 있다고 생각합니다.

다음 코드 (테스트를 거치지 않고 서식 지정하는 중 ...)로 원하는 것을 제공해야합니다. 파일 이름 (토론에서 약간 불명확 함)으로 멋진 일을하고 싶다면 다른 것을해야 할 수도 있습니다.

program test 
    double precision f 
    dimension f(10,10) 
    integer i,j 

    OPEN(61,file="file.txt",action='write',status='replace') 
    do i=1,2 
    do j=1,2 
    f(i,j)= i+10d0*j 
    WRITE(61,*) f(i,j) 
    enddo 
    enddo 
    CLOSE(61) 

    stop 
    end 

이 당신이 모든 실행에 file.txt에서 원하는 항상 출력을 제공 할 것입니다. (이전 버전을 대체하는) 파일을 한 번 열어 더블 루프가 반복 될 때마다 f을 쓰십시오. (동일한 파일에서 이전 파일 다음에 각 f의 각 레코드를 쓰십시오. 여기서는 혼란 스러울 것입니다. append)를 입력하고 파일을 닫습니다.

새로운 예와 편집

당신은 문제가 지금은 분명하다 기록했다. 이것은 원래 게시물에서 설명 할 수 있다면 많은 시간을 피하고 도왔을 것입니다.

해결 방법은 루프 내부에 조건을 추가하여 루프의 첫 번째 반복인지 확인합니다 (각 k 값에 해당). k 루프는 가장 빠른 (내부 루프) 반복을 수행해야합니다.

program test 
    double precision f 
    dimension f(10,10,10) 
    integer i,j,k 
    character*500 ofile 

    do i=1,2 
    do j=1,2 
    do k=1,5 
     f(i,j,k)= i+10d0*j+k 
     WRITE(ofile,'(A,F4.2,A,F4.2,A)')'file',i*1d0,'_',j*1d0,'.dat' 
     if (k.eq.1) then 
     OPEN(61,file=ofile,action='write',status='replace') 
     else 
     OPEN(61,file=ofile,action='write',position='append') 
     end if 
     WRITE(61,*)k,f(i,j,k) 
     CLOSE(61) 
    enddo 
    enddo 
    enddo 
    stop 
    end 

각 실행 그냥 루프를 시작하기 전에 call system('rm file*')를 추가하기 전에 그냥 파일을 제거의 아이디어에 충실하려는 경우

(이 유닉스 터미널입니다).

+0

감사합니다. 이것은 내가 원하는 것이 아닙니다. 문제를 분명히 말할 수 없을 수도 있습니다. 내부 루프에서 파일을 열고 싶습니다. mathematica에 관해서는 문제를 아주 쉽게 말할 수 있습니다. 1 출력 1, 출력 2 >> file.txt를 >>> file.txt를 VS 2 출력 1, 출력 2 >>> file.txt를 >>> file.txt를 두 차이는 케이스 1 인 매번 실행하면 file.txt에 새로 추가되지만 case-2에서는 이전 파일에 추가됩니다. 어쩌면 새 티켓을 분명히 언급해야 할 것입니다. NB : fortran에서 쉽게 벗어날 수있는 한 가지 방법은 실행할 때마다 file.txt를 삭제하는 것입니다. –

+0

하지만 왜 루프 내부에서 파일을 열어야합니까? –

+0

내 파일 이름이 do 루프 구문으로 포맷 되었기 때문에 안으로 열리고 있습니다. 완전한 코드가 있습니다. 두 번 실행하면 문제를 알 수 있습니다. '프로그램 테스트 배정도, 치수 F 나, J, 문자 * 500 ofile가 K = 1,10 제가 = 1,2는 J = 1을 수행 하는가 K (10,10,10) 정수 F (i, j, k) = i + 10d0 * j + k WRITE (ofile, '(A, F4.2, A, F4.2, A)') 'file', i * 1d0, (i, j, k) WRITE (61, *) k, f (i, j, k)OPEN (61, file = ofile, action = '쓰기', position = '추가') enddo enddo enddo CLOSE (61) stop end' –

관련 문제