Informacje wejściowe/wyjściowe pliku#
W Fortranie plikami można zarządzać przed identyfikatory jednostek. Interakcje z systemem plików wykonywane są głównie przez wbudowane procedury open
oraz inquire
. Zazwyczaj przepływ pracy polega na otwarciu pliku dzięki identyfikatorowi jednostki, odczytaniu lub/i zapisaniu go, a następnie jego ponownym zamknięciu.
integer :: io
open(newunit=io, file="log.txt")
! ...
close(io)
Domyślnie, plik zostanie utworzony jeśli jeszcze nie istnieje, a następnie otworzony do odczytu oraz zmodyfikowania. Pisanie w istniejącym pliku rozpocznie się w pierwszym rejestrze (wersie), a więc plik domyślnie zostanie nadpisany.
Aby plik mógł zostać otwarty tylko do odczytu pola status
oraz action
muszą zostać określone
integer :: io
open(newunit=io, file="log.txt", status="old", action="read")
read(io, *) a, b
close(io)
W przypadku kiedy plik nie istnieje pojawi się błąd czasu wykonania. Aby sprawdzić czy dany plik istnieje przed otwarciem go funkcja inquire
może zostać użyta
logical :: exists
inquire(file="log.txt", exist=exists)
if (exists) then
! ...
end if
Ewentualnie, procedura open
może opcjonalnie zwrócić iostat i iomsg:
integer :: io, stat
character(len=512) :: msg
open(newunit=io, file="log.txt", status="old", action="read", &
iostat=stat, iomsg=msg)
if (stat /= 0) then
print *, trim(msg)
end if
Należy pamiętać, że iomsg wymaga zmiennej o stałej długości i wystarczającej pojemności do przechowywaniu komunikatu błędu.
Podobnie, pisanie w pliku dzieje się poprzez użycie słów kluczowych status oraz action. Aby stworzyć nowy plik użyj
integer :: io
open(newunit=io, file="log.txt", status="new", action="write")
write(io, *) a, b
close(io)
Ewentualnie, status="replace"
może zostać użyty do nadpisania istniejącego pliku. Zaleca się jednak najpierw sprawdzić czy dany plik istnieje przed zdecydowaniem się na użycie status. Aby dołączyć do pliku wyjściowego, słowo kluczowe position może zostać określone jawnie za pomocą
integer :: io
open(newunit=io, file="log.txt", position="append", &
& status="old", action="write")
write(io, *) size(v)
write(io, *) v(:)
close(io)
Do zresetowania pozycji w pliku mogą zostać użyte wbudowane procedury rewind
oraz backspace
. rewind
zresetuje pierwszy rejestr (wers), natomiast backspace
powróci do poprzedniego rejestru (wersu).
Na koniec, aby usunąć plik najpierw musi zostać otwarty i może zostać usunięty po jego zamknięciu przy pomocy
logical :: exists
integer :: io, stat
inquire(file="log.txt", exist=exists)
if (exists) then
open(file="log.txt", newunit=io, iostat=stat)
if (stat == 0) close(io, status="delete", iostat=stat)
end if
Przydatną funkcji IO są pliki robocze, które mogą być otwarte dzięki status="scratch"
. Są one automatycznie usuwane po zamknięciu identyfikatora jednostki.