Читаем Программирование на языке пролог полностью

Файлы имеют определенную длину. Это означает, что они содержат определенное количество литер. В конце файла имеется специальный маркер, называемый маркером конца файла.Мы не обсуждали маркер конца файла до сих пор, так как выход на конец файла является более обычным делом для файлов, расположенных во внешней памяти, чем при обмене с терминалом. Если программа производит чтение файла, то маркер конца файла может быть обнаружен и в случае, когда программа читает термы и когда читаются отдельные литеры. Если при выполнении get0(X)встречается конец файла, то Xбудет конкретизирована некоторой управляющей литерой, обычно имеющей код 26 в таблице кодов ASCII. Если конец файла встречается при выполнении read(X), то Xбудет конкретизирована некоторым специальным термом, значение которого зависит от конкретной Пролог-системы. При попытке прочитать файл далее маркера конца возникает ошибка.

Имеется встроенный (стандартный) файл, называемый user. Чтение этого файла вызывает ввод данных с клавиатуры терминала, а запись в этот файл приводит к тому, что литеры печатаются на дисплее. Такой режим работы считается стандартным. При вводе с клавиатуры терминала признак конца файла генерируется при вводе управляющей литеры с кодом ASCII 26. Это окажет на выполнение get0и readтакое же воздействие, как если бы встретился конец файла.

<p>5.4.1. Запись в файлы</p>

Для записи в файлы термов и литер могут быть использованы в точности те же самые предикаты, что обсуждались ранее Единственное различие состоит в том, что когда мы хотим записать данные в файл, то нам надо сменить текущий выходной поток данныхтак, чтобы им являлся файл, в который мы будем записывать данные, а не дисплей терминала. Текущий выходной поток данных изменяется с помощью предиката tell.Если Xконкретизирована именем файла, которое должно быть атомом, то целевое утверждение tell(X)переключает текущий выходной поток данных таким образом, что любая операция записи (выполняемая с помощью write, putи других подобных предикатов) будет производиться в этот файл, а не на дисплей терминала. Целевое утверждение tell(X)можно согласовать лишь один раз. Точно так же при выполнении Прологом возврата за целевое утверждение tellне происходит восстановления прежнего текущего выходного потока данных. Наряду со сменой текущего выходного потока данных предикат tellв зависимости от ситуации выполняет также другие операции. В первый раз, когда программа обращается к tellс конкретным именем файла X, Пролог считает, что необходимо завести новый файл с этим именем. Поэтому если Xконкретизирована некоторым именем файла и файл с таким именем уже существует, то все литеры, уже содержащиеся в этом файле, удаляются. Напротив, если файла с именем, являющимся значением X, не существует, то файл с таким именем будет создан. В обоих случаях файл считается открытым (для записи в него). Это значит, что каждая последующая запись в этот файл будет добавлять литеры в конец файла до тех пор, пока не появится явное указание, что запись в файл полностью завершена (пока файл не будет закрыт). С данного момента если будет сделана новая попытка записи в этот файл, то Пролог, как и прежде, будет считать, что необходимо писать новую версию этого файла. При попытке выполнить tell(X),когда переменная Xне имеет конкретного значения или ее значение не является именем файла, возникает ошибка. Реакция Пролог-системы на возникающие ошибки зависит от конкретной реализации.

Предикат tellingиспользуется для определения имени файла, служащего текущим выходным потоком данных. Целевое утверждение telling(X)считается согласованным, если Xимеет своим значением имя файла текущего выходного потока данных. Как вы, наверное, догадываетесь, если X неконкретизировано, то tellingконкретизирует Xатомом (именем файла), делающим это целевое утверждение верным.

Когда запись в файл полностью завершена, то выполнение предиката toldоформит конец файла и закроет его (для вывода). Кроме того, в результате его выполнения текущим выходным потоком данных снова станет дисплей терминала. Таким образом, типичная последовательность целевых утверждений для записи в файл некоторой совокупности литер имеет вид

… tеll(фред), write(X), told,…

Если текущий выходной поток данных переключается на другой файл без использования told,то прежний файл не будет закрыт и останется доступным для записи в него. Это позволяет делать записи в файл с перерывами, как в следующем примере;

…tell (X), write(A), tell(user),write(B), tell(X), write(C), told.

<p>5.4.2. Чтение файлов</p>
Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT