2015-04-17 2 views
0

Я хочу скопировать файл из папки и записать в определенных строках файла, используя fortran. Я использую Windows, компилятор GNU fortran. Вот пример файла и кода. file1.txtКак писать на определенных строках в fortran

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

Вот код: я определил некоторые переменные. Только если совпадают два критерия (конкретное значение переменной и номер строки), я хочу записать в новый текст в файле. Я попытался использовать команду system для копирования, но это не удается. Может ли кто-нибудь сказать мне правильный способ использования этого? И программа получила время выполнения ошибки 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 

Могу ли я читать и писать в том же файле? Пожалуйста, поделитесь своими комментариями. Я сослался на некоторые вопросы Fortran - How to write data to specific line in the file?, но не мог мне помочь.

+0

Во-первых изменить ваш "неформатированный" в "отформатированных". Unformatted означает двоичный и отформатированный текст (более или менее). Но имейте в виду, что файлы прямого доступа требуют, чтобы все строки имели одинаковую длину. Как вы использовали 'system', как это произошло? –

+1

Обновление файла «на месте» возможно, но может быть сложно. Обычно гораздо проще читать файл и записывать строки в новый файл, заменяя те, которые вы хотите заменить по ходу дела. Этот последний подход позволит избежать беспорядка, который допускает ошибки в вашем прямом доступе, и вы оставите вас в первый раз, когда будете работать с файлом. Тебе повезло? –

+0

@HighPerformanceMark вы можете сказать мне способ сделать копию файла? – user3705273

ответ

2

В системном вызове есть пара ошибок. Во-первых, вам нужно пространство между copy и первым аргументом. Во-вторых, вам нужен файл назначения, а не только папка. Кроме того, вы должны использовать только конкатенаторы строк //, а не запятые. Например, если вы хотите скопировать на новое имя файла file2.txt, вы можете использовать системный вызов, как это:

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

Поскольку вы используете буквенные строки вместо переменных, вы можете упростить его, избавившись от в concatenaters:

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

Да, это сработало! Большое спасибо! – user3705273

1

для иллюстрации, вот как направить работу доступа с текстовым файлом:

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 

результирующего файла:

 
12345678 
3.14 42 
qwertyui 
+0

Просто пояснить: для работы с * nix необходимы только изменения, которые изменяются 'recl' от' 10' до '9' и избавляются от возврата каретки' char (13) '. –

+0

Спасибо за ваш ответ. Однако, как указано в вопросе, мой файл не имеет постоянной длины. Итак, не могу ли я внести изменения в файл «онлайн»? Я не понял, почему мы не можем вносить изменения в файл с переменной длиной строки. Существуют ли какие-либо ограничения со стороны компилятора или ОС? – user3705273

+0

в принципе вы можете открыть с помощью 'recl = 1', чтение и запись отдельных символов, но на самом деле стандартный подход состоит в том, чтобы прочитать весь файл и переписать весь файл с желаемыми изменениями. Это не ограничение fortran, тем не менее, независимо от языка. – agentp