And there were often pretty good language support for those accesc
methods in Cobol, Fortran, Pascal etc..
That was a technology requirement: Here is my justification for saying
that.
Initially the computer prime input methods were cards and paper tape,
followed by magnetic tape. Of these, the only character at a time i/o
method was paper tape - Cards are an all or nothing deal - read the whole
card or don't read it. Same applied to writing to it. Magnetic tape has
always has its data written and read in blocks.
If you commit to transferring a complete card image, then record-oriented
i/o is the obvious thing to do. It was supported at the assembler level
too: in a 1900 or S/360 the 'read' and 'write' instructions were handed a
device reference, buffer pointer and buffer length and, in
acknowledgement that peripherals were slow, there was also a 'wait for i/
o completion' instruction, so a typical assembler program could process a
card while the next was being read. No threading involved, folks! Given
this basis, it follows that:
- tapes and disks, which both have fairly substantial wait times before
date can be transferred were also best handled as record-oriented
devices[1].
- Tape: pause while the medium gets up to speed
- Disk: wait for heads to move to the required track and then for
rotation to bring the required block under the heads.
[1] in the case of disk and tape, initially the block was the record
but it was soon realised that grouping several records into a
block was more efficient.
- paper tape could read or write a character at a time, but there's
still a small start/stop time, so here too, dealing with a record
is more efficient though its harder to manage since the program
still reads single characters and must store the character its just
read, check for the record separator and issue the next i/o
operation before the tape reader or punch has stopped.
- with this background it's logical that the early high level
languages (FORTRAN, COBOL, RPG) would use record oriented i/o.
The real anomaly is the trouble all more recent languages (C, Java, Algol
68, PL/1, etc.) have taken to hide the underlying record/block transfer
nature of many i/o devices from the programmer.
Algol 60, Pascal and BASIC fall in the middle: the Algol 60 spec leaves
i/o as an implementation issue[2] and IIRC Pascal and BASIC can swing
either way.
[2] Eliott Algol was character oriented because the computers used paper
tape as the prime i/o medium and introduced READ and WRITE as reserved
words. All other implementations I've seen handled i/o by calling library
routines.