2016-07-25 7 views
0

Я хочу прочитать данные из некоторых файлов в Fortran, я могу сделать это, когда имена файлов имеют обычный порядок. но теперь он не является регулярным, хотя у всех есть один и тот же префикс: Fix001, Fix002, Fix023, Fix432, ...Как открыть все файлы с определенным расширением (префикс в имени) в fortran?

Я хочу, чтобы программа получила префикс от пользователя и открыла все файлы в цикле, прочитала данных и записать их в один файл. любая идея? Спасибо.

PROGRAM Output 
Implicit none 
Integer ::n=5  !number of files 
Integer ::nn=50 !number of rows in each file 
Integer ::i,j 
Real,Dimension(:),Allocatable::t,x,y,z 
Character(len=12)::TD 

Open(11,file='outputX.txt') 
Allocate (t(1000),x(1000),y(1000),z(1000)) 

j=0 
Do i=1,n 
    Write(TD,10)i 
    Write(*,*)TD 
    Open(1,file=TD) 
     Read(1,*)(t(j),x(j),j=1,nn) 
     Write(11,20)(x(j),j=1,nn) 
j=j+1 
Enddo 

10 Format('100',i3.3,'') 
20 Format(<nn>E25.8E3) 

Deallocate(x,y,z,t) 
END PROGRAM Output 
+0

FYI 'целое :: п = 5' не эквивалентно' целого числа п :: ; n = 5', но 'integer, save :: n = 5'. Это удивляет многих новых Fortraners. – jlokimlin

+0

признаться, я не знал, но теперь он все равно работает;) –

+0

Какая конкретная проблема вы видите с этой программой? – francescalus

ответ

1

Если у вас есть верхний предел, вы можете попытаться открыть файл и тест с параметром iostat, который был ли успешным. Если это не так, вы пропустите файл.

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

program read_files 
    implicit none 
    integer :: i, d 
    integer :: ioerr 
    character(len=len("FixXXX.txt")) :: fname 

    open(unit=30, file="Output.txt", action="write", iostat=ioerr) 
    if (ioerr /= 0) stop 1 

    do i = 0, 999 
     write(fname, '(A, I3.3, A)') "Fix", i, ".txt" 
     open(unit = 40, file=fname, status="old", action="read", iostat=ioerr) 
     if (ioerr /= 0) cycle 
     read(40, *) d 
     write(30, *) d 
     close(40) 
    end do 
end program read_files 
+0

Поскольку OP использует gfortran, я предлагаю использовать спецификатор 'newunit' вместо идентификаторов файлового блока жесткого кодирования. – jlokimlin

+0

Я не уверен, как «новое» утверждение 'newunit'. Он спросил о F77 к F95 - поэтому я не хотел делать ничего, что выходит за пределы этого диапазона. – chw21

+1

Для тех, кто использует компиляторы без поддержки 'newunit', вы можете посмотреть http://fortranwiki.org/fortran/show/newunit для пользовательской реализации, которая может использоваться до обновления вашего компилятора. –