13.1.3 Port Buffers and Positions (original) (raw)
13.1.3 Port Buffers and Positions🔗ℹ
Some ports—especially those that read from and write to files—are internally buffered:
- An input port is typically block-buffered by default, which means that on any read, the buffer is filled with immediately-available bytes to speed up future reads. Thus, if a file is modified between a pair of reads to the file, the second read can produce stale data. Callingfile-position to set an input port’s file position flushes its buffer.
- An output port is typically block-buffered by default, though a terminal output port is line-buffered, and the initial error output port is unbuffered. An output buffer is filled with a sequence of written bytes to be committed as a group, either when the buffer is full (in block mode), when a newline is written (in line mode), when the port is closed viaclose-output-port, or when a flush is explicitly requested via a procedure like flush-output.
If a port supports buffering, its buffer mode can be changed viafile-stream-buffer-mode (even if the port is not afile-stream port).
For an input port, peeking always places peeked bytes into the port’s buffer, even when the port’s buffer mode is 'none; furthermore, on some platforms, testing the port for input (viachar-ready? or sync) may be implemented with a peek. If an input port’s buffer mode is 'none, then at most one byte is read for read-bytes-avail!*,read-bytes-avail!, peek-bytes-avail!*, orpeek-bytes-avail!; if any bytes are buffered in the port (e.g., to satisfy a previous peek), the procedures may access multiple buffered bytes, but no further bytes are read.
In addition, the initial current output and error ports are automatically flushed when they are terminal ports (seeterminal-port?) and when read, read-line,read-bytes, read-string, etc., are performed on the initial standard input port. (More precisely, instead ofread, flushing is performed by the default port read handler; see port-read-handler.)
Forces all buffered data in the given output port to be physically written. Only file-stream ports, TCP ports, and custom ports (see Custom Ports) use buffers; when called on a port without a buffer, flush-outputhas no effect.
If flushing a file-stream port or TCP port encounters an error when writing, then all buffered bytes in the port are discarded. Consequently, a further attempt to flush or close the port will not fail.
Changed in version 7.4.0.10 of package base: Consistently, discard buffered bytes on error, including in a TCP output port.
Gets or sets the buffer mode for port, if possible. File-stream ports support setting the buffer mode, TCP ports (see Networking) support setting and getting the buffer mode, and custom ports (see Custom Ports) may support getting and setting buffer modes.
If mode is provided, it must be one of'none, 'line (output only), or'block, and the port’s buffering is set accordingly. If the port does not support setting the mode, theexn:fail exception is raised.
If mode is not provided, the current mode is returned, or#f is returned if the mode cannot be determined. Ifport is an input port and mode is'line, the exn:fail:contract exception is raised.
Returns or sets the current read/write position of port.
Calling file-position without a position on a port other than a file-stream port or string portreturns the number of bytes that have been read from that port if the position is known (seeCounting Positions, Lines, and Columns), otherwise the exn:fail:filesystem exception is raised.
For file-stream ports and string ports, the position-setting variant sets the read/write position to pos relative to the beginning of the file or (byte) string if pos is a number, or to the current end of the file or (byte) string if pos is eof. In position-setting mode, file-position raises theexn:fail:contract exception for port kinds other thanfile-stream ports and string ports. Furthermore, not all file-stream ports support setting the position; if file-position is called with a position argument on such a file-stream port, theexn:fail:filesystem exception is raised.
When file-position sets the position pos beyond the current size of an output file or (byte) string, the file/string is enlarged to size pos and the new region is filled with0 bytes; in the case of a file. In the case of a file output port, the file might not be enlarged until more data is written to the file; in that case, beware that writing to a file opened in'append mode on Unix and Mac OS will reset the file pointer to the end of a file before each write, which defeats file enlargement via file-position. If pos is beyond the end of an input file or (byte) string, then reading thereafter returnseof without changing the port’s position.
When changing the file position for an output port, the port is first flushed if its buffer is not empty. Similarly, setting the position for an input port clears the port’s buffer (even if the new position is the same as the old position). However, although input and output ports produced by open-input-output-file share the file position, setting the position via one port does not flush the other port’s buffer.
Like file-position on a single argument, but returns#f if the position is not known.
Sets the size of the file written by port to size, assuming that the port is associated to a file whose size can be set.
The new file size can be either larger or smaller than its current size, but “truncate” in this function’s name reflects that it is normally used to decrease the size of a file, since writing to a file or using file-position can extend a file’s size.