2013-10-25 13 views
8

私はFortranプログラム(書式付き)によって書かれた既存のファイルを持っており、ファイルの先頭にいくつかの行を追加したいと思います。アイデアは元のファイルのコピーを作成せずにそうすることです。Fortranで上書きせずに既存のファイルに書き込む

私は、ファイルの末尾に行を追加することができます。

open(21,file=myfile.dat,status='old',action='write', 
     form='formatted',position="append") 
write(21,*) "a new line" 

が、私が試したとき:

open(21,file=myfile.dat,status='old',action='write', 
     form='formatted',position="rewind") 
write(21,*) "a new line" 

それは全体のファイルを上書きします。

可能性があります。 少なくとも、私はそれが事実上不可能であることを確認することがうれしいです。

答えて

4

はい、不可能です。 position=を使用すると、書き込みの位置のみが設定されます。通常、シーケンシャルファイルの書き込みによって、現在のレコードを超えたものをすべて削除します。ダイレクトアクセスファイルで最初にレコードを調整することは可能かもしれませんが、最初に何かを追加するだけではありません。まずコピーを作成する必要があります。

+0

をしかし、あなたはで全体をメモリに古いファイルを読む必要はありません。一度。 OSを使用して、古いファイルの名前を一時ファイル名に変更します。次に、古いファイル名を使用して新しいファイルを作成し、必要なデータを入れます。次に、古いファイルを新しいファイルに追加します。 (OSやファイルのデータの性質によっては、OSでそのデータを実行できるかもしれません。) – dmm

+0

「最初にコピーを作成する」にはあなたの状況も含まれます。 –

-1

可能です!タスクを達成するためのサンプルプログラムを次に示します。あなたは未フォーマットのデータを使用して期待するどのように多くの行を知っている場合は

! Program to write after the end line of a an existing data file 
    ! Written in fortran 90 
    ! Packed with an example 

    program write_end 
    implicit none 
    integer :: length=0,i 

    ! Uncomment the below loop to check example 
    ! A file.dat is created for EXAMPLE defined to have some 10 number of lines 
    ! 'file.dat may be the file under your concern'. 


    !  open (unit = 100, file = 'file.dat') 
    !  do i = 1,10 
    !  write(100,'(i3,a)')i,'th line' 
    !  end do 
    !  close(100) 

    ! The below loop calculates the number of lines in the file 'file.dat'. 

    open(unit = 110, file = 'file.dat') 
    do 
     read(110,*,end=10) 
     length= length + 1 
    end do 
    10 close(110) 

    ! The number of lines are stored in length and printed. 

    write(6,'(a,i3)')'number of lines= ', length 

    ! Loop to reach the end of the file. 

    open (unit= 120,file = 'file.dat') 
    do i = 1,length 
     read(120,*) 
    end do 

    ! Data is being written at the end of the file... 

    write(120,*)'Written in the last line,:)' 
    close(120) 
    end 
+0

彼はファイルの**最初の**に書きたいと思っています。と書いて、ちょうど 'position = append'を使ってください。 –

+0

ありがとう、私は質問を正しく読まなかった。もう一度やりなさい。 position = append、 の間に違いがあるかどうか分かりませんが、access = 'append'、status = 'old'も同様です。 – Sathyam

+0

'access = append'は奇妙な非標準拡張です。標準では、Fortran 90は 'position = append'です –

0

、直接アクセスファイルの読み取り/書き込みメソッドを使用してみてください。これは、後で配列のようにアクセスできる 'レコード'に各行の情報を格納する可能性があります。

最初に追加するには、ファイルの先頭に「ヘッダー」という行があるように空のレコードをいくつでも作成し、元に戻してその値を実際の行に変更します後で。

ダイレクトアクセス、ファイルIOの例:

CHARACTER (20) NAME 
INTEGER I 
INQUIRE (IOLENGTH = LEN) NAME 
OPEN(1, FILE = 'LIST', STATUS = 'REPLACE', ACCESS = 'DIRECT', & 
     RECL = LEN) 

DO I = 1, 6 
    READ*, NAME 
    WRITE (1, REC = I) NAME    ! write to the file 
END DO 

DO I = 1, 6 
    READ(1, REC = I) NAME    ! read them back 
    PRINT*, NAME 
END DO 

WRITE (1, REC = 3) 'JOKER'   ! change the third record 

DO I = 1, 6 
    READ(1, REC = I) NAME    ! read them back again 
    PRINT*, NAME 
END DO 

CLOSE (1) 
END 

コードソース、「ダイレクトアクセスファイル」のセクションを参照してください。 http://oregonstate.edu/instruct/ch590/lessons/lesson7.html

関連する問題