0
votes

I want to copy a file from a folder and write at specific lines of the file using fortran. I am using Windows, GNU fortran compiler. Here is sample file and code. file1.txt

1 *
2 **
3 ***
4 ****
5 *****
6 ******
7 *******
8 ********
9 *********
10 **********

Here is code: I defined some variables. Only if two criteria match (particular variable value and line number), I want to write in the new text in the file. I tried using system command to copy, but it fails. Can anyone tell me correct way of using this? And program got run time error FORMAT present for unformatted text

program read

   integer :: a,b,c,d,e
   CHARACTER (LEN=200) :: str

   a=0
   b=1
   c=0
   d=1
   e=0

    !call system ("copy" // "D:\test1\file1.txt"," ", // "D:")
    !This command fails

   open (unit=10, file="file1.txt", access="direct", & 
form="unformatted",  action="readwrite", recl=100 )

   do i=1,10,1
    read (10,*) str 

    if(a==0 .AND. i==3) then
        write(10,100) 'This is ',i,' line'
    else if(b==0 .AND. i==4) then
        write(10,100) 'This is ',i,' line'
    else if(c==0 .AND. i==5) then
        write(10,100) 'This is ',i,' line'
    else if(d==0 .AND. i==6) then
        write(10,100) 'This is ',i,' line'
    else if(e==0 .AND. i==7) then
        write(10,100) 'This is ',i,' line'
    100 format (2a,i0,1X)
    end if
   end do

   close (unit=10)  
end program 

Can I read and write in the same file? Please share your comments. I referred to some questions Fortran - How to write data to specific line in the file? but couldn't help me.

2
First change your "unformatted" to "formatted". Unformatted means binary and formatted is text (more or less). But be aware direct access files require all lines to have the same length. How did you used system how it failed? - Vladimir F
Updating a file 'in-place' is possible but can be tricky. It's usually far more straightforward to read the file and write lines to a new file, replacing those which you want to replace as you go. This latter approach will avoid the mess that mistakes in your direct access will leave you with the first time you operate on a file. Do you feel lucky ? - High Performance Mark
@HighPerformanceMark can you tell me a way to do line by line file copy? - user3705273

2 Answers

2
votes

There are a couple things wrong with your system call. First, you need a space between copy and the first argument. Second, you need a destination file, not just a folder. Also, you should only be using string concatenaters //, not commas. For example, if you want to copy to a new file name file2.txt, you can use a system call like this:

call system ("copy " // "D:\test1\file1.txt " // "D:\test1\file2.txt")

Because you're using literal strings instead of variables, you can simplify it by getting rid of the concatenaters:

call system ("copy D:\test1\file1.txt D:\test1\file2.txt")
1
votes

for illustration, here is how to direct access work with a text file:

implicit none
character*8 x
! create a test file, all lines 8 characters:
open(20,file='test.txt')
x='12345678'
write(20,'(a)')x
x='asdfghjk'
write(20,'(a)')x
x='qwertyui'
write(20,'(a)')x
close(20)
! open file direct access, note record length is 8+2 because I'm
! stuck on DOS today with cr/lf line ends
open(20,file='test.txt',access='direct',recl=10,form='formatted')
! read whatever we want
read(20,'(a)',rec=3)x
write(*,*)'line 3 is',x
! overwrite a particular line -- note the format is exactly 10 char
! including the manually added line ending
write(20,'(f5.2,i3,2a)',rec=2)3.14,42,char(13),char(10)
end

resulting file:

12345678
 3.14 42
qwertyui