Read: Difference between revisions
(→interpretation: eliminate statement about deprecated PChar) |
(more comments) |
||
Line 2: | Line 2: | ||
The procedures <syntaxhighlight lang="pascal" enclose="none">read</syntaxhighlight> and <syntaxhighlight lang="pascal" enclose="none">readLn</syntaxhighlight> retrieve a date from a [[Text|<syntaxhighlight lang="pascal" enclose="none">text</syntaxhighlight> file]]. | The procedures <syntaxhighlight lang="pascal" enclose="none">read</syntaxhighlight> and <syntaxhighlight lang="pascal" enclose="none">readLn</syntaxhighlight> retrieve a date from a [[Text|<syntaxhighlight lang="pascal" enclose="none">text</syntaxhighlight> file]]. | ||
They are defined as part of the [[Pascal]] programming language. | They are defined as part of the [[Standard Pascal|Pascal]] programming language. | ||
Everyone can expect them to work no matter which compiler has been used. | Everyone can expect them to work no matter which compiler has been used. | ||
Line 118: | Line 118: | ||
Beware, it is necessary to check for end of file. | Beware, it is necessary to check for end of file. | ||
Unlike <syntaxhighlight lang="pascal" enclose="none">readLn</syntaxhighlight> no default value is loaded. | Unlike <syntaxhighlight lang="pascal" enclose="none">readLn</syntaxhighlight> no default value is loaded. | ||
Of course, it would be even better to catch wrong key strokes right when they are made, but this is not possible when utilizing <syntaxhighlight lang="pascal" enclose="none">read</syntaxhighlight> or <syntaxhighlight lang="pascal" enclose="none">readLn</syntaxhighlight>. | |||
Therefore their main application is non-interactive programs reading (generated) data files. | |||
== see also == | == see also == | ||
* {{Doc|package=RTL|unit=system|identifier=read|text=<syntaxhighlight lang="pascal" enclose="none">system.read</syntaxhighlight>}} and {{Doc|package=RTL|unit=system|identifier=readln|text=<syntaxhighlight lang="pascal" enclose="none">system.readLn</syntaxhighlight>}} | * {{Doc|package=RTL|unit=system|identifier=read|text=<syntaxhighlight lang="pascal" enclose="none">system.read</syntaxhighlight>}} and {{Doc|package=RTL|unit=system|identifier=readln|text=<syntaxhighlight lang="pascal" enclose="none">system.readLn</syntaxhighlight>}} | ||
* [[Why use Pascal#The Readln and Writeln effect|Why use Pascal, § “the <syntaxhighlight lang="pascal" enclose="none">readLn</syntaxhighlight> and <syntaxhighlight lang="pascal" enclose="none">writeLn</syntaxhighlight> effect”]] | * [[Why use Pascal#The Readln and Writeln effect|Why use Pascal, § “the <syntaxhighlight lang="pascal" enclose="none">readLn</syntaxhighlight> and <syntaxhighlight lang="pascal" enclose="none">writeLn</syntaxhighlight> effect”]] | ||
* [[Secure programming]] regarding how to properly treat input | |||
[[Category:Code]] | [[Category:Code]] |
Revision as of 21:31, 7 November 2018
│
Deutsch (de) │
English (en) │
The procedures read
and readLn
retrieve a date from a text
file.
They are defined as part of the Pascal programming language.
Everyone can expect them to work no matter which compiler has been used.
behavior
signature
Read
as well as readLn
share the same formal signature.
As an optional first parameter a text
variable can be specified where data are read from.
If none is specified, input
is assumed.
Thereafter any number of variables can be specified, but at least one has to be present.
They have to be either char
, integer
, real
, or string
.
Earlier versions of FPC also allowed reading variables of the type PChar
.
This has been removed, since no buffer checking is possible with those.
execution
Calling read
/readLn
will place the read (and possibly accordingly interpreted) values to the given variables.
The order of variables matters. For instance, when the following program
program readDemo(input, output, stderr);
var
i: integer;
c: char;
begin
readLn(i, c);
end.
is supplied with
42 x
everything is fine.
i
will become 42
and c
will become 'x'
.
But the reverse input order
x 42
will yield a run-time error (in this case RTE 106).
Once data are read and stored, they are “consumed”, thus cannot be retrieved otherwise, but via the variables only.
However, data are read up to the variable's size limits.
E.g. a fixed length string[24]
will stop reading beyond the 24th character.
Leading blanks in front of numeric types are skipped.
If no data is available, possibly because the end of file has already been reached, default values for the remaining variables are loaded.
interpretation
Read
and readLn
are so powerful, because they interpret given data.
For instance, a readLn
storing an integer does not expect the binary value to be entered, but their decimal representation with ASCII numerals suffices (e.g. 42
instead of *
[asterisk has the numeric value 42]).
While char
and string
can be stored (sort of) directly, the numeric types integer
and real
are converted following certain rules.
The rules are those, you normally write literals of such types within your Pascal source code.
However, some compiler's (here FPC) allow additional formats:
An integer's hexadecimal base can be indicated by prepending 0x
, 0X
or just x
and X
instead of the usual $
(dollar sign).
difference between read
and readLn
ReadLn
will in contrast to read
consume a trailing line feed.
It is discarded and does not have any influence on how to save supplied data.
The read line ending is platform-independent.
A line ending typical for Windoze-platforms will be read and does not pose a problem, even if the program is run on Linux or any other platform.
production usage
Read
and readLn
have a major drawback in that they expect the user to supply data in a given order.
If they do not comply a run-time error will terminate the program.
This is quite unsatisfactory, since a run-time error number won't enlighten the end user.
You usually want to design your error messages in a way the user is capable in correcting her behavior.
When reading ordinal types one can make use of the val
procedure.
program readNumbers(input, output, stderr);
{**
reads an integer from input
\param destination the variable to store the read value in
\returns true if reading was successful
*}
function readLnInteger(var destination: integer): longbool;
var
/// temporarily stores input string
userInput: ansistring;
/// stores return code of val
errorPosition: valSInt;
begin
readLn(userInput);
val(userInput, destination, errorPosition);
// val is successful, if no character caused problems
readLnInteger := errorPosition = 0;
if not readLnInteger then
begin
// set an arrow right below
// the character causing troubles
writeLn(space(errorPosition-1), '⇡');
end;
end;
{ === M A I N ================================================ }
var
i: integer;
begin
repeat
begin
writeLn('Enter an integer:');
end
until eof() or readLnInteger(i);
if eof() then
begin
halt(1);
end
end.
Beware, it is necessary to check for end of file.
Unlike readLn
no default value is loaded.
Of course, it would be even better to catch wrong key strokes right when they are made, but this is not possible when utilizing read
or readLn
.
Therefore their main application is non-interactive programs reading (generated) data files.
see also
system.read
andsystem.readLn
- Why use Pascal, § “the
readLn
andwriteLn
effect” - Secure programming regarding how to properly treat input