WARNING: This example assumes spaces are ignored for the I and F descriptors and the output is sent to a printer.
Suppose we have an input like the following. Each row starts with a salesperson's number (10 positions), followed by his/her phone numbers (10 positions), followed by the bonus this person has earned. Each salesperson's number has seven digits, the first two gives the division code, followed by two digits of department code, followed by three digits of person code. A phone number has seven digits in the form of 482-0911.
Write a Fortran program that reads in the above input and prints the following table:1 1 2 2 ....5....0....5....0....5 7645094 7079173 1000 8745363 6347862 1120 8701001 7130067 750 4000023 6700175 1253 8801810 9000018 980
Note that the first position is always for printer control. Note also that we do not know the number of salespersons.1 1 2 2 3 3 ....5....0....5....0....5....0....5 Sales Amount Table ================== Sales No. Phone No. Amount --------- --------- ------ 76-45-094 707-9173 1000 87-45-363 634-7862 1120 87-01-001 713-0067 750 40-00-023 670-0175 1253 88-01-810 900-0018 980 Total 5 person(s) processed.
Click here to download this program.PROGRAM Decoding IMPLICIT NONE CHARACTER(LEN=2) :: SN_1, SN_2, SN_3*3 CHARACTER(LEN=3) :: Phone_1, Phone_2*4 INTEGER :: Amount INTEGER :: Number INTEGER :: Status LOGICAL :: Problem CHARACTER(LEN=10) :: TitleFormat = "(T8,A)" CHARACTER(LEN=10) :: HeadingFormat = "(T2,A)" CHARACTER(LEN=30) :: InputFormat = "(A2,A2,A3,3X,A3,A4,3X,I5)" CHARACTER(LEN=30) :: OutputFormat = "(1X, 5A, T14, 3A, T26,I6)" CHARACTER(LEN=30) :: LastLine = "(1X, A, I3, A)" WRITE(*,TitleFormat) "Sales Amount Table" WRITE(*,TitleFormat) "==================" WRITE(*,*) WRITE(*,HeadingFormat) "Sales No. Phone No. Amount" WRITE(*,HeadingFormat) "--------- --------- ------" Problem = .FALSE. Number = 0 DO READ(*,InputFormat, IOSTAT=Status) & SN_1, SN_2, SN_3, Phone_1, Phone_2, Amount IF (Status > 0) THEN WRITE(*,*) "Something wrong in your input data" Problem = .TRUE. EXIT ELSE IF (Status < 0) THEN EXIT ELSE WRITE(*,OutputFormat) & SN_1, "-", SN_2, "-", SN_3, Phone_1, "-", Phone_2, Amount Number = Number + 1 END IF END DO IF (.NOT. Problem) THEN WRITE(*,*) WRITE(*,LastLine) "Total", Number, " person(s) processed." END IF END PROGRAM Decoding
1 1 2 2 3 3 ....5....0....5....0....5....0....5 Sales Amount Table ================== Sales No. Phone No. Amount --------- --------- ------ 76-45-094 707-9173 1000 87-45-363 634-7862 1120 87-01-001 713-0067 750 40-00-023 670-0175 1253 88-01-810 900-0018 980 Total 5 person(s) processed.
The table heading "Sales Amount Table" starts at position 8 and as a result we can use T8 to move there rather than adding spaces into the string. Thus, we have a CHARACTER variable TitleFormat for this purpose:1 1 2 2 3 3 ....5....0....5....0....5....0....5 Sales Amount Table ================== : : :
CHARACTER(LEN=10) :: TitleFormat = "(T8,A)" WRITE(*,TitleFormat) "Sales Amount Table" WRITE(*,TitleFormat) "=================="
The following are the format and WRITE statements. We have a CHARACTER variable to store the format in which T2 is used to move to position 2:1 1 2 2 3 3 ....5....0....5....0....5....0....5 Sales No. Phone No. Amount --------- --------- ------ : : :
CHARACTER(LEN=10) :: HeadingFormat = "(T2,A)" WRITE(*,HeadingFormat) "Sales No. Phone No. Amount" WRITE(*,HeadingFormat) "--------- --------- ------"
CHARACTER(LEN=30) :: InputFormat = "(A2,A2,A3,3X,A3,A4,3X,I5)" READ(*,InputFormat, IOSTAT=Status) & SN_1, SN_2, SN_3, Phone_1, Phone_2, Amount
You can use T2 to move to position 2 or 1X to skip the first position. The remaining two fields can be positioned using T14 and T26. The following is the format and the READ statement:1 1 2 2 3 3 ....5....0....5....0....5....0....5 76-45-094 707-9173 1000 87-45-363 634-7862 1120 87-01-001 713-0067 750 40-00-023 670-0175 1253 88-01-810 900-0018 980
CHARACTER(LEN=30) :: OutputFormat = "(1X, 5A, T14, 3A, T26,I6)" WRITE(*,OutputFormat) & SN_1, "-", SN_2, "-", SN_3, Phone_1, "-", Phone_2, Amount