Technical Notes Database TN894D.txt READ & READLN - DIFFERENCES BETWEEN 3.0 AND 4.0+ Category :Pascal Platform :All Product :Turbo Pascal 3.0+ Description: Q. What are the changes between Read and Readln of 3.0 and 4.0+? A. The problem which you have encountered is due to a modification of the READ procedure in Turbo Pascal version 4.0+. In version 4.0+, the READ procedure was altered to allow the creation of text file device drivers. Also, the Read procedure handles keyboard input in the same manner as if reading from a disk file. This change has the following effects: 1) The carriage return and line feed character combination generated when the Return key is pressed, is no longer cleared from the file input buffer. However, the cursor still advances to the beginning of the next line. 2) A Read(NumericVar) call no longer defaults the NumericVar's value. In version 3.0, a simple press of the Return key caused the program to retain the value of the NumericVar and processing continued. In version 4.0, a non white-space character input is required. Simply pressing the Return key will cause the cursor to advance to the next line and continue to wait for input. 3) Since the carriage return and line feed combination no longer are handled, they remain in the file input buffer until the next Read call. If the next call is of the type Read(CharacterVar), CharacterVar will return the carriage return character, ASCII 13. A subsequent Read(CharacterVar) call will return the line feed character, ASCII 10. For this reason a Read(Ch); call may appear to have no effect, if it follows Read procedure call. 4) A Read(StringVar) will have a different effect. With the ASCII 13, carriage return and 10, line feed characters as the next to be read in the keyboard buffer, the EOLN function returns true. When reading from a disk file a Read(FileVar, StringVar) returns a null string in StringVar. The same is true with keyboard input. For example the following code will create an infinite loop: Read(AnyVar); Repeat Read(StringVar); Until StringVar <> ''; I suggest that you replace all Read(from standard input) to Readln calls. Many developers have resolved this difference by implementing ReadChar, ReadString, ReadInt, and ReadReal procedures based on the ReadKey function. Reference: 7/16/98 4:35:37 PM
Last Modified: 01-SEP-99