포인터와 연결 구조체를 이용한 인터넷 주소 통계 처리

PROGRAM Internet_Address

IMPLICIT NONE

TYPE List_Node
CHARACTER(15) :: TCP_IP_Address
INTEGER :: Count
TYPE(List_Node), POINTER :: NEXT
END TYPE List_Node

CHARACTER(15) :: Address, FileName*20
INTEGER :: OpenStatus, InputStatus
TYPE(List_Node), POINTER :: AddressList

WRITE (*, '(1X, A)', ADVANCE ="NO") "Enter name of address file : "
READ *, FileName

OPEN (UNIT = 10, FILE = FileName, STATUS = "OLD", IOSTAT = OpenStatus)
IF (OpenStatus > 0) THEN
STOP "*** cannot open address file ***"
END IF

NULLIFY(AddressList)

DO
READ (UNIT = 10, FMT = '(A)', IOSTAT = InputStatus) Address

IF (InputStatus > 0) THEN
STOP "*** Input error ***"
END IF

IF (InputStatus < 0) THEN
EXIT ! end of file
END IF

CALL Add_To_List(AddressList, Address)

END DO

CALL Output_Addresses(AddressList)

CONTAINS

SUBROUTINE Add_To_List(AddressList, Address)

TYPE(List_Node), POINTER :: AddressList, LocPtr
CHARACTER(*), INTENT(IN) :: Address
INTEGER :: AllocateStatus
LOGICAL :: In_the_List

IF (.NOT. ASSOCIATED(AddressList)) THEN

ALLOCATE(AddressList, STAT = AllocateStatus)
IF (AllocateStatus /= 0) STOP "*** out of memory ***"

AddressList%TCP_IP_Address = Address
AddressList%Count = 1
NULLIFY(AddressList%Next)

ELSE

CALL Search(AddressList, Address, LocPtr, In_the_List)

IF (In_the_List) THEN
LocPtr%Count = LocPtr%Count + 1
ELSE
ALLOCATE(LocPtr, STAT = AllocateStatus)
IF (AllocateStatus /= 0) STOP "*** out of memory ***"

LocPtr%TCP_IP_Address = Address
LocPtr%Count = 1
LocPtr%Next => AddressList

AddressList => LocPtr
END IF

END IF

END SUBROUTINE Add_To_List

SUBROUTINE Search(AddressList, Address, LocPtr, In_the_List)

TYPE(List_Node), POINTER :: AddressList, LocPtr
CHARACTER(*), INTENT(IN) :: Address
LOGICAL, INTENT(INOUT) :: In_the_List

LocPtr => AddressList

In_the_List = .FALSE.

DO

IF (In_the_List .OR. .NOT. ASSOCIATED(LocPtr)) EXIT

IF (LocPtr%TCP_IP_Address == Address) THEN
In_the_List = .TRUE.
ELSE
LocPtr => LocPtr%Next
END IF

END DO
END SUBROUTINE Search

SUBROUTINE Output_Addresses(AddressList)

TYPE(List_Node), POINTER :: AddressList, Ptr

Ptr => AddressList

PRINT *, "Summary of Internet address data"
PRINT *
PRINT *, " Address Count"
PRINT *, "==========================="

DO
IF (.NOT. ASSOCIATED(Ptr)) THEN
EXIT
END IF

PRINT '(1X, A, 4X, I4)', Ptr%TCP_IP_Address, Ptr%Count

Ptr=>Ptr%Next
END DO

END SUBROUTINE Output_Addresses

END PROGRAM Internet_Address

위 소스를 10_01_Address.f95로 저장

자료

128.159.4.20
123.111.222.333
100.1.4.31
34.56.78.90
120.120.120.120
128.159.4.20
123.111.222.333
123.111.222.333
77.66.55.44
100.1.4.31
123.111.222.333
128.159.4.20

위 자료를 address.dat로 저장

소스 컴파일 및 프로그램 테스트

+ Recent posts