В спецификации ISO/IEC 7185:1990(E) Standard Pascal в пункте 6.9.1 для процедуры прочтения подраздел «a)» читается следующим образом:
a) Для n>=1 функция read(f,v1,...,vn) должна получить доступ к текстовому файлу и установить ссылка на этот текстовый файл для оставшегося выполнения заявление; каждый из v1,...,vn должен быть переменным доступом, имеющим тип, который является действительным типом, является строковым типом или совместим с типом char или с целочисленным типом. При n>=2 выполнение read(f,v1,...,vn) должно быть эквивалентно
начать чтение (ff, v1); читать(ff,v2,...,vn) конец
где ff обозначает указанный текстовый файл.
В нем перечислены допустимые типы переменных параметров: вещественные, строковые и типы, совместимые с символьными или целыми числами.
Однако оставшаяся часть предложения не определяет поведение строковых типов. В подразделе «b)» рассматривается тип char, в подразделе «c)» — целое число, в подразделе «d)» — тип real, но о строках больше не упоминается.
Я нахожу это странным, поскольку соответствующая процедура write определяет поведение строк в пункте 6.9.3.6 при описании того, что делают ее параметры. Судя по всему, цель состоит в том, чтобы позволить читать строки из текстовых файлов непосредственно в переменную доступа, имеющую строковый тип, иначе зачем вообще упоминать об этом в пункте 6.9.1?
Это ошибка в спецификации или я неправильно прочитал?
Я считаю, что это ошибка, возникшая в результате одновременной разработки ISO 10206 (хотя стандарт 10206 был утвержден позже). В предисловии ISO 10206 Extended Pascal говорится:
Техническое развитие
Расширенный Паскаль включает в себя функции ANSI/IEEE770X3.97-1983 и следующие новые возможности: […]
- Процедура read была расширена для чтения строк из текстовых файлов.
Выделение этого как новой функции предполагает, что ISO 7185:1983 не имеет такой возможности.
Кроме того, Кэтлин Дженсен и Никлаус Вирт пишут на Паскале — руководство пользователя и отчет (4-е исправленное издание) (10.1007/978-1-4612-4450-9), § 12.1 Прочтите часть отчета на Паскале:
При использовании
Read
в текстовом файле применяются следующие правила. Пустьf
обозначает текстовый файл, аv1
, …,vn
обозначают переменные типа Char или Integer (или поддиапазона любого из них) или Real.
Ни слова о чтении из файла text
в строковую переменную.
ПУМАР 4th изд. повторяет ISO 7185:1990.
Наконец, следует признать, что это слабое место, но компилятор GNU Pascal отказывается считывать строковую переменную в режиме ‑‑standard‑pascal
.
Разработчики GPC проделали большую работу по максимальному соблюдению стандартов ISO, поэтому я уверен, что они также правильно интерпретировали указанный раздел.