okay, in my program i open a .txt file with three columns. 1st column has integers, 2nd has a name (character string), and 3rd has real numbers. i have figured out how to search the integers and real numbers for the item the user enters (compare variables to the arrays storing the columns)…but when i try to search for a name entered by the user, in the character array, it never works. here is a all my code… i am looking for help in CASE(2)
~ n holds the number of lines in the file
PROGRAM database
IMPLICIT NONE
CHARACTER(30)::file, search
INTEGER::err, n, m, i, k, searchtype, recordnum
LOGICAL:: alive
REAL:: grade
REAL, ALLOCATABLE:: arrayr(:)
INTEGER, ALLOCATABLE:: arrayi(:)
CHARACTER(15), ALLOCATABLE:: arrayc(:)
CHARACTER(15)::name
101 FORMAT(A)
DO
WRITE(*,101) "What is the filename?"
READ(*,*) file
INQUIRE(FILE=file, EXIST=alive)
IF (alive.EQV..TRUE.) THEN
WRITE(*,101) "The file exists"
OPEN (UNIT=11, FILE=file, STATUS="OLD", ACTION="READ", IOSTAT=err)
IF (err .NE. 0) THEN
WRITE(*,'(2A)')"There was an error opening ", file
STOP
END IF
EXIT
ELSE IF (alive.EQV..FALSE.) THEN
WRITE(*,'(2A)') "There is no file by the name of: ", file
CYCLE
END IF
END DO
n= 0
DO
READ(11,*,IOSTAT=k)
IF(k.EQ.-1) EXIT
n=n+1
END DO
REWIND(11)
ALLOCATE(arrayi(n),arrayc(n),arrayr(n))
DO i=1,n,1
READ(11,'(I4,A,F12.2)') arrayi(i), arrayc(i), arrayr(i)
END DO
outer: DO
DO
WRITE(*,101)"How would you like to search the file?"
WRITE(*,101)"1) By record number"
WRITE(*,101)"2) By name"
WRITE(*,101)"3) By rating"
READ(*,*) searchtype
SELECT CASE (searchtype)
CASE(1)
WRITE(*,101) "Please enter the record number:"
READ(*,*) recordnum
m=0
DO i=1,n,1
IF (arrayi(i).EQ.recordnum) THEN
WRITE(*,'(I4,A,F12.2)')arrayi(i),arrayc(i), arrayr(i)
ELSE IF (i==n) THEN
write(*,*)"Sorry dude. The name you entered was not found. Search failed"
END IF
END DO
EXIT
CASE(2)
WRITE(*,101) "Please enter the name:"
READ(*,*) name
m=0
DO i=1,n
IF (name.EQ.arrayc(i)) THEN
WRITE(*,'(I4,A,F12.2)')arrayi(i), arrayc(i), arrayr(i)
ELSE IF (i==n) THEN
write(*,*)"Sorry dude. The name you entered was not found. Search failed"
END IF
END DO
EXIT
CASE(3)
WRITE(*,101) "This will return all graders greater than your search term"
WRITE(*,101) "Please enter the minimum grade:"
READ(*,*) grade
m=0
DO i=1,n,1
IF (arrayr(i).GT.grade) THEN
WRITE(*,'(I4,A,F12.2)')arrayi(i), arrayc(i), arrayr(i)
ELSE IF (i==n) THEN
write(*,*)"Sorry dude. The name you entered was not found. Search failed"
END IF
END DO
EXIT
CASE DEFAULT
WRITE(*,101) "Invalid entry. Please enter 1, 2, or 3."
CYCLE
END SELECT
END DO
inner: DO
WRITE(*,101)"Would you like to search again? (Y/N)"
READ(*,*)search
SELECT CASE (search)
CASE("Y","y")
CYCLE outer
CASE("N","n")
EXIT outer
CASE DEFAULT
WRITE(*,101)"Invalid entry. please enter Y or N."
CYCLE inner
END SELECT
END DO inner
END DO outer
END PROGRAM database
everytime i select case(2) in the program and then enter a name I KNOW EXISTS in the character arrayc, it skips over the if clause where (name.EQ.arrayc) and returns that the name was not found. PLEASE HELP! i am very open to other ways of doing this. i dont understand why this is happening.
There is a screenshot on this link:
http://tinypic.com/r/33tmmuc/6
—-EDIT – SOLUTION—-
You read the string by a weird format and it starts with spaces. Use this for the comparison:
Check the handbook for what it does.
Consider getting rid of the CAPITAL letters and archaic .EQ. operators.
Use better formats and don’t use the labels for them, but a string variable or a constant. Something as
might be ok, check for the correct values of the numbers. Be aware that
F12.2reads100as1.00.Also you implemented the loop wrong. The
exitshould be just in the place after you found the answer.—-EDIT – SOLUTION—-
Works for me:
run:
Be sure to have correct
n. Also try to print the character array to be sure. Be careful not to comparenamewhich is too long (your variable is two times longer than the strings in the array). Your practice of comparing the value of the loop index after the loop is questionable, its value is undefined.I would completely rewrite the loop structure. Something as: