Классификация текстовых редакторов.

advertisement
МИНИСТРЕРСТВО ОБРАЗОВАНИЯ И НАУКИ
РОССИЙСКОЙ ФЕДЕРАЦИИ
ГОУ НИЖЕГОРОДСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ
ИМ. Р.Е. АЛЕКСЕЕВА
ИНСТИТУТ РАДИОЭЛЕКТРОНИКИ И ИНФОРМАЦИОННЫХ
ТЕХНОЛОГИЙ
КАФЕДРА "ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ И ТЕХНОЛОГИИ"
Дисциплина "Программирование на языках высокого уровня"
Пояснительная записка
к курсовой работе
Тема:
"Консольный текстовый редактор"
Выполнил: Сидоренко О.О.
студент группы: 10-В-1
Проверил: Мартынов Д.С.
Нижний Новгород
2011
Содержание.
Состояние вопроса
Назначение и классификация ТР........................................................3
Функционально-близкие аналоги.......................................................5
Анализ алгоритмов работы ФБА........................................................9
Введение.........................................................................................................11
Разработка технического задания................................................................13
Разработка концептуальной модели............................................................15
Разработка логической модели....................................................................16
Описание программы....................................................................................17
Руководство пользователя
Описание..............................................................................................18
«Горячие» клавиши и клавиши управления.....................................18
Ограничения при работе с программой и возможные сбои...........19
Прочее...................................................................................................20
Руководство программиста
Общее....................................................................................................21
Общие сведения об исходном коде...................................................21
Описание глобальных переменных...................................................22
Количество выделяемой памяти........................................................22
Описание функций..............................................................................22
Обработка введённых данных...........................................................24
Таблица сообщений программы........................................................24
Разработка текстового примера
Пример1...............................................................................................27
Пример2...............................................................................................30
Примеры ошибок................................................................................34
Заключение....................................................................................................36
Список сокращений......................................................................................37
Список используемой литературы..............................................................38
Приложение...................................................................................................39
2
Состояние вопроса.
1.1
Назначение и классификация текстовых редакторов.
Основное назначение текстовых редакторов - создавать текстовые
файлы, редактировать тексты, просматривать их на экране, изменять формат
текстового документа, распечатывать его на принтере.
Набираемый на клавиатуре компьютера текст воспроизводится на экране
дисплея в рабочем поле редактора. Специальный значок - курсор указывает то
место на экране, на которое пользователь в данный момент может оказывать
воздействие (создавать, изменять символы и т. д.) с помощью редактора.
Работая с текстовым редактором, можно получить на экране информацию о
текущем состоянии курсора, т.е. его координатах на экране (номер строки и
позиции в строке), а также о номере страницы текста, его формате,
используемом шрифте и т.д.
Интерфейс практически каждого текстового редактора позволяет иметь
на экране меню команд управления редактором - изменение режимов работы,
обращение за помощью, форматирование текста, печати и т. д. Как правило,
меню имеет не только текстовую форму, но и форму пиктограмм,
указывающих на выполняемую команду.
Классификация текстовых редакторов.
I. По возможностям
1) Качество печатной машинки, небольшой набор возможностей по
работе с текстом.
 Norton Editor
 Фотон
 Лексикон
 MultiEdit
 Chiwriter
2) Издательское качество. Реализация принципа WYSIWYG — What
You See Is What You Get.
 Microsoft Word
 Ventura Publishers
 Aldus Page Maker
Для работы с такими редакторами требуется ПК не ниже AT 486 DX с
8Мб оперативной памяти.
3) Технические редакторы —Tex, Latex и т.д.
II. По типу файлов, с которыми работают ТР.
 текстовые файлы
 графический набор
Возможны и другие варианты классификации текстовых редакторов,
например редакторы печатных текстов и редакторы электронных документов
и т.д.
3
В большинстве случаев для создания деловых документов достаточно
качества печатной машинки. Поэтому широкое распространение получил
редактор текстов Лексикон для MS DOS.
В общем случае для оценки удобства работы с ТР могут служить
следующие параметры:
- количество необходимых нажатий клавиш для выполнения
конкретной операции(колеблется от 1-2 до 20-30);
- скорость отображения измененного текста на экране при загрузке,
перемещениях по тексту, редактировании - вставке, копировании и удалении
фрагментов, смене шрифтов и т.д.;
- удобство работы с помощью, т.е. скорость вызова подсказок, их
полнота, и структура;
- возможность реализации WYSIWYG, т.е. получение на экране
точной копии будущего печатного документа — текста без управляющих и
разметочных символов;
- ограничения на длину файлов;
- количество одновременно обрабатываемых текстовых файлов;
- возможности использования новых шрифтов и алфавитов, их
расширения и дополнения;
- требования к аппаратному обеспечению — например, к объему
оперативной памяти ПК.
4
1.2 Функционально близкие аналоги(ФБА)
Рассмотрим консольный текстовый редактор.
Существует множество консольных текстовых редакторов и
функционально близких им аналогов. В основном такие редакторы больше
всего разрабатываются для платформ Linux, т.к. администратору машины
чаще приходится работать со средствами командной строки, нежели с
полностью графическим интерфейсом.
Примером могут служить такие редакторы как joe, vi, Emacs, GNU Nano,
так же нельзя не упомянуть встроенный редактор оболочки Midnight
Commander – Cooledit.
Во многих дистрибутивах Linux в качестве общесистемного редактора
предлагается GNU Nano. Он очень прост в использовании, нежели vi, emacs и
прочие более продвинутые редакторы. Но в то же время он наполнен большим
функционалом: поиск и замена, подсветка синтаксиса, проверка орфографии,
копирование и вставка строк, вставка других файлов в текущий.
Верхняя часть окна – строка состояния. В ней отображается информация
о редакторе и текущем файле. Она статична и перемещается вместе с экраном,
такие же по свойству строки меню, расположенные внизу экрана. Состоят из
названия команды и клавиши, при нажатии на которую будет исполнена
команда.
Редактор joe обладает полноценным интерфейсом в консольном режиме.
И имеет достаточно широкие возможности: подсветка синтаксиса, открытие
для редактирования нескольких файлов, запуск внутренних команд,
использование комбинации клавиш.
5
Верхнюю строку занимает строка состояния, в которой содержится
состояние нажатых управляющих клавиш, имя редактируемого файла,
положение курсора (строка и колонка), текущее время. Основной объём
экрана занимает рабочая область редактирования текста. Курсор может
перемещаться с помощью стандартных клавиш: стрелок, PgUp / PgDn и т.п..
Внизу экрана находится командная строка, в которой выводятся вопросы или
сообщения редактора.
Редактор joe имеет ряд встроенных команд. При этом joe может быть
запущен в качестве потокового редактора, когда на стандартный вход
подаётся последовательность команд по изменению или созданию текста.
Для вычисления простых математических функций и выражений
используется встроенный калькулятор, вызываемый по нажатию ESC+M.
У редактора vi имеется несколько потомков, которые в чем-то его
улучшают и усовершенствуют. Это такие редакторы как Vim, bvi, Nvi и т.д.
Среди этой серии Vim более распространён, т.к. это один из мощнейших
текстовых редакторов с полной свободой настройки и автоматизации.
Одна из главных особенностей редактора — применение двух основных,
вручную переключаемых, режимов ввода: командного (после запуска
редактор находится в нём) и текстового (режим непосредственного
редактирования текста, аналогичный большинству «обычных» редакторов). В
редакторе имеется поддержка Unicode, возможность работы со многими
файлами одновременно, неограниченная глубина отмены (undo) и возврата
(redo) действий, подсветка синтаксиса, автоматическое определение величины
отступа для каждой строки в зависимости от языка программирования,
поддержка языка сценариев; возможность написания модулей расширения —
плагинов, распознавание и преобразование файлов различных форматов,
6
поддержка языков с письмом справа налево (арабских и других), сворачивание
(folding) текста для лучшего обзора.
Строка состояния в Vim располагается снизу и отображает сведения о
файле и положения курсора.
CoolEdit имеет более приятный интерфейс: привычный, для работавших
с редактором Norton Commander’а, синий фон с белыми буквами, статусная
строка в верхней части экрана и линейка нумерованных (по функциональным
клавишам) операций - внизу. Привычно работают клавиши Home и End, delete
и backspace.
Этот редактор обеспечивает выполнение большинства функций
редактирования, присущих полноэкранным редакторам текста. С его
помощью можно редактировать файлы практически любого размера,
поскольку верхняя граница для размера редактируемого файла составляет 16
Мбайт. Обеспечивается редактирование исполняемых (двоичных) файлов без
потери данных. Поддерживается копирование, перемещение, удаление,
7
вырезание и вставка блоков текста, отмена предыдущих операций, вставка
файлов, поиск и замена по регулярным выражениям, а также собственный
вариант операций поиска и замены, основанный на функциях scanf-printf,
выделение текста комбинацией клавиш <Shift>+<стрелки> .
8
1.3 Анализ алгоритмов работы ФБА.
Все редакторы более или менее приближены к одному и тому же
алгоритму работы:

Выделение памяти под текстовый буфер, куда будет считан файл.

Очистка экрана. Чаще всего при этом экран заполняется
символами перевода строки.

Инициализируется бесконечный цикл, в котором будет
выполняться основная часть программы.
В цикле:
 Вывод полученных данных на экран.
 Ожидание ввода символа.
 Обработка введённого символа.
Например: если нажата клавиша Enter, то перемещение курсора на одну
строку вниз на начало этой строки, если Backspace – удаление предыдущего
символа от курсора и перемещение его на позицию влево, так же происходит
сдвиг всех символов перед курсором на одну позицию влево. Аналогично,
если введён буквенный символ, то он отображается на экран, сдвигая курсор и
все символы за курсором. Параллельно с этим меняется содержимое
символьного массива, в котором и располагается текст.
Алгоритмы некоторых основных функций редактора:
Вывод текста на экран:

Определение координаты курсора на экране.

Посимвольный вывод массива.

Перемещение курсора на нижнюю строку и вывод строки меню.
Открытие файла:

Запрос имени файла.

Открытие и копирование файла в строку.

Вывод строки и закрытие файла.
Сохранение файла:

Запрос имени файла.

Открытие файла.

Запись в файл основного массива (в котором располагается
набранный текст).

Закрытие файла.
Переход вверх/вниз на строку:

Вычитание/прибавление определённого числа единиц (ширина
текстового поля) к указателю на символьный массив.

Перевод курсора на строку вверх/вниз.
Переход к началу/концу строки осуществляется аналогичными
способами.
9
Поиск дальше по документу:

Запрос необходимой последовательности.

Поиск последовательности, используя один из алгоритмов.
Например, алгоритм Бойера-Мура.
Описание:
Сначала строится таблица смещений для искомого шаблона.
Совмещается начало текста (строки) и шаблона, проверка начинается с
последнего символа шаблона. Если последний символ шаблона и
соответствующий ему при наложении символ строки не совпадают, то образец
сдвигается относительно строки на величину, полученную из таблицы
смещений. Причем символ берётся из строки и ищется соответствующий
сдвиг в таблице. После сдвига начинается проверка с последнего символа.
Если символы совпадают, производится сравнение предпоследнего символа
шаблона и т. д. Если все символы шаблона совпали с наложенными
символами строки, значит была найдена подстрока и поиск окончен. Если же
какой-то не последний символ шаблона не совпадает с соответствующим
символом строки, шаблон сдвигается на один символ вправо и снова
начинается проверка с последнего символа. Весь алгоритм выполняется до тех
пор, пока либо не будет найдено вхождение искомого образца, либо не будет
достигнут конец строки.

При нахождении нужной последовательности перевод курсора на
её первый символ.
Выделение фрагмента текста:

Определение позиции курсора и получение этой позиции в
символьном массиве.

Запись этой позиции в переменную.

Определение конечной позиции курсора и получение этой позиции
в символьном массиве.

Копирование (вырезание) всех символов от начальной до
конечной позиции в дополнительную строку (буфер обмена).
10
Введение.
Целью данного проекта является выполнение и защита курсовой работы
по дисциплине "Программирование на языках высокого уровня" на языке C++.
Основными задачами данного проекта является закрепление и
расширение знаний по алгоритмам языка программирования C++, привитие
навыков самостоятельной работы, получение навыков сбора и анализа
необходимой информации, умение работать с литературой, формирование
опыта по оформлению документации.
Тема курсового проекта "Консольный текстовый редактор"
соответствует одному из видов деятельности образовательноквалификационной характеристики специальности.
Основной задачей, которую необходимо решить при написании данного
курсового проекта, является разработка и создание приложения,
позволяющего пользователю работать с текстовыми документами.
Практически каждый пользователь компьютера встречается с
необходимостью подготовки тех или иных документов — писем, статей,
служебных записок, отчетов, рекламных материалов и т.д. Разумеется, эти
документы можно подготавливать и без компьютера, например на пишущей
машинке. Однако с появлением персональных компьютеров стало
значительно проще и удобнее, а следовательно, и выгоднее подготавливать
документы с помощью компьютеров.
При использовании персональных компьютеров для подготовки
документов текст редактируемого документа выводится на экран, и
пользователь может в диалоговом режиме вносить в него свои изменения. Все
внесенные изменения сразу же отображаются на экране компьютера, и потом
при распечатке выводится красиво и правильно оформленный текст, в
котором учтены все сделанные пользователем исправления. Пользователь
может переносить куски текста из одного места документа в другое,
использовать несколько видов шрифтов для выделения отдельных участков
текста, печатать подготовленный документ на принтере в нужном числе
экземпляров.
Удобство и эффективность применения компьютеров для подготовки
текстов привели к созданию множества программ для обработки документов.
Такие программы называются редакторами текстов (Word Processors).
Возможности этих программ различны — от программ, предназначенных для
подготовки небольших документов простой структуры, до программ для
набора, оформления и полной подготовки к типографскому изданию книг и
журналов (издательские системы).
11
Основные функции этого класса прикладных программ заключаются в
вводе и редактировании текстов. Дополнительные функции состоят в
автоматизации процессов ввода и редактирования. Для операций ввода,
вывода и сохранения данных текстовые редакторы вызывают и используют
системное программное обеспечение. Впрочем, это характерно и для всех
прочих видов прикладных программ, и в дальнейшем мы не будем специально
указывать на этот факт.
С этого класса прикладных программ обычно начинают знакомство с
программным обеспечением и на нем отрабатываются первичные навыки
взаимодействия с компьютерной системой.
12
Разработка технического задания
1.
Формулировка технического задания.
1.1 Наименование образца:
Console Text Editor (Консольный Текстовый Редактор)
1.2 Основание для выполнения работы:
Выполнение на основании приказа на курсовую работу в соответствии с
учебным планом.
1.3 Исходные данные:
Исходными данными для Console Text Editor является текстовый файл в
ASCII-кодировке, либо любой двоичный файл.
1.4 Цели и назначения работы:
Образец должен обеспечить быстрое и удобное редактирование
текстовых файлов, не подключая графические модули. Так же целью данного
проекта является выполнение и защита курсовой работы по дисциплине
"Программирование на языках высокого уровня" на языке C++.
1.5 Область применения разработки:
Console Text Editor может использоваться в большинстве сфер
деятельности как редактор или обозреватель файлов в текстовом режиме.
1.6 Требования к разрабатываемой системе:
Образец должен соответствовать функциональным требованиям,
требованиям надёжности и качества выполнения.
1.7 Функциональные требования:
Образец должен :

изменять (создавать/открывать/сохранять/замещать) текстовые
файлы, либо любые двоичные файлы

дописывать в любое место файла набранные символы.

искать в файле символы и строки, заданные пользователем

интерактивно (по желанию пользователя) перемещаться по всему
файлу, используя примитивное управление курсором («клавиши со
стрелками»).
1.8 Требования к аппаратному обеспечению:
Сертификация оборудования на работу с линейкой операционных
систем Microsoft.
1.9 Требования к программному обеспечению:
В качестве платформы для запуска программного обеспечения следует
использовать одну из операционных систем Microsoft.
1.10 Требование надёжности:
Программа-образец и все её части должны:

функционировать без каких-либо посторонних вмешательств в
исходный код

не нарушать стабильность работы операционной системы
(грамотная работа с памятью и т.п.)
13

не получать данные о пользователе и не передавать их другим
лицам, кроме информации о правах пользователя относительно файлов.
1.11 Требования по эргономике и технической эстетике:
Код образца должен быть написан с использованием таких алгоритмов и
функций, при которых обеспечивалось бы наиболее безопасное и «быстрое»
выполнение программы-образца.
«Окно» программы представляет собой преобразованное окно консоли,
а значит, информация должна быть представлена максимально понятно
пользователю лишь с использованием псевдографических символов и цвета
фона или символов. Оптимальным и более привычным для пользователей
консоли считается такое расположение информации в окне, при котором в
нижних двух или одной строке отображается список наиболее нужных
«горячих клавиш» (англ. Hot Keys) и приписанных им функций. Над этими
строками располагается «поле ввода», которое и выполняет основные
функции программы-образца: редактирование и просмотр.
1.12 Требования по эксплуатации, удобству технического
обслуживания, ремонту и хранению:
Эксплуатация программы-образца производится строго по правилам
эксплуатации, встроенным в саму программу и приложенным в виде файла.
Иначе, в соответствии с лицензией freeware, пользователь сам несёт
ответственность за нанесённый ущерб с использованием программы-образца.
По вопросам технического обслуживания и ремонта продукта обращаться в
информационно-вычислительный центр НГТУ им.Алексеева.
1.13 Требования по стандартизации и унификации:
Console Text Editor разрабатывается на языке С++ с использованием
стандартных информационных средств и сервисов.
1.14 Календарный план:
Курсовая работа рассчитана на 14-15 недель.
Начало работы: 11.02.2011
14
Разработка концептуальной модели.
Упрощённую концептуальную модель можно построить из трёх
действий.
Ввод данных
Обработка данных
Вывод результата
Немного расширив модель до аппаратного уровня можно составить
алгоритм взаимодействия Пользователь – Программа – Результат.
Операционная система
Исходные
данные,
вводимые
пользователем
Обработка данных
Вывод
сообщений
Технические средства

Пользователь вызывает программу и вводит необходимые данные.

Операционная система на базе технических средств предоставляет
ресурсы для работы программы

Программа обрабатывает введённые данные, обращаясь к
средствам операционной системы. Формирует сообщение для вывода.

Вывод сообщения на устройство вывода происходит через
средства операционной системы.
15
Разработка логической модели.
Разработанная концептуальная модель легла в основу логической
модели проекта. Логическая модель разрабатываемой программы включает в
себя набор функций, каждая из которых выполняет свою собственную задачу.
Проанализируем трансформацию концептуальной модели данных в
логическую.
Ввод данных ➝ данные - ограниченный только возможностью
отображения набор символов, вводимый пользователем в окно редактора.
Обработка данных ➝ набор функций, разделяющих данные на
управляющие и отображаемые. А также выполнение команд при вводе
управляющих данных.
Вывод результата ➝ вывод набранного пользователем текста,
реализация диалога с пользователем при вводе управляющих данных.
Пока не
завершена
программа
Запрос данных
Да
Управляющие
Нет
Команды
управления
Да
Отображаемые
Отображение
Нет
16
Описание программы.
Проект состоит из:

Файл исходного кода программы CTE.cpp .

Собранный файл программы CTE.exe .

Файл справки ReadMe.txt .

Буфер текста stdbuf.
Файл исходного кода CTE.cpp содержит:

Исходный код программы на языке C++.

Комментарии к коду.
Собранный файл программы CTE.exe:

Обеспечивает запрос данных от пользователя.

Преобразует данные, следуя алгоритму

Выводит результат на устройство вывода.
Файл справки ReadMe.txt содержит:

Краткая инструкция по эксплуатации.

Краткое описание работы управляющих клавиш.

Полная инструкция по эксплуатации.

Полное описание работы управляющих клавиш.

Ограничения вводимых данных.

Возможные ошибки в ходе работы программы.

Контактная информация, лицензия
Системные требования.
 Операционная система: MS DOS или любая операционная
система семейства MS Windows
 16 Мб оперативной памяти.
 115 Кб свободного пространства на жестком диске.
 Клавиатура.
Это программное обеспечение не поддерживает системы *Unix.
Файл CTE.exe определяется как Приложение в среде MS Windows. При
запуске из графического интерфейса открывается окно консоли, в котором
выдаётся запрос команды для дальнейшего действия. В любом из выбранных
случаев окно программы обновится для свободного редактирования. При
нажатии функциональных клавиш, подсказка к которым выводится на нижней
строке, выполнится определённое действие. Если приложение запускается из
командной строки, то выполняться оно будет в том же окне или на том же
экране, где была команда запуска.
17
Руководство пользователя.
1. Описание.
Текстовый редактор Console Text Editor предназначен для создания,
редактирования и просмотра документов в текстовом режиме.
Окно программы разделено на две части: верхняя – область
редактирования, рабочая область и нижняя – область информации.
При запуске в области информации появляется строка «New file y/n?»
(Новый файл y/n?), ожидается ввод символа ‘y’ от пользователя, при этом
будет запрошено имя файла(«Insert name of file:», «Введите имя файла»),
который будет создан. Если был введён любой иной символ, то программа
попытается открыть файл с введённым именем. Если файл не сможет быть
открыт по какой-либо причине, то в области информации отобразится строка
«File not found», иначе в рабочей области отобразиться первые 12 строк файла
и курсор будет занимать позицию в верхнем левом углу. В области
информации при этом отобразится «F1-help F2-save F3-load F4-Find ESC-exit
x:y page:z», где ‘x’ и ‘y’ – позиции курсора на экране по осям X и Y
соответственно, а ‘z’ – номер текущей страницы документа.
2. «Горячие» клавиши и клавиши управления:
F1 – Выводит на экран первые 784 символа файла ReadMe.txt. В них
содержится краткое описание программы. При нажатии затем любой клавиши
рабочая область возвращается в то состояние, которое было до нажатия «F1».
F2 – В область информации выводится строка «SAVE:Insert name of
file:»(«Введите имя файла:»). От пользователя ожидается ввод имени файла
под которым будет сохранено содержимое пролистанных страниц.
Сохранение файла построено таким образом, что сохраняться в файл будет
только то, что было выведено на экран. Для того, чтобы сохранить файл
целиком необходимо просмотреть все страницы документа.
F3 – В область информации выводится строка «New file y/n?» (Новый
файл y/n?), ожидается ввод символа ‘y’ от пользователя, при этом будет
запрошено имя файла(«Insert name of file:», «Введите имя файла:»), который
будет создан. Если был введён любой иной символ, то программа попытается
открыть файл с введённым именем. Если файл не сможет быть открыт по
какой-либо причине, то в области информации отобразится строка «File not
found», иначе в рабочей области отобразиться первые 12 строк файла и курсор
будет занимать позицию в верхнем левом углу. Открытый до этого файл
сохранён не будет.
F4 – В области информации выводится строка «Find:»(«Искать:»). От
пользователя ожидается ввод искомой на текущей странице строки. Если
строка будет найдена, то курсор перейдёт на позицию перед строкой, иначе в
область информации выведется сообщение «Not found on this page»(«Не
найдено на этой странице»), после чего ожидается нажатие любой клавиши.
ESC – В области информации выводится строка «Are you sure? y/n»(«Вы
уверены? y/n»). От пользователя ожидается нажатие клавиши ‘y’, после чего
18
программа завершит свою работу. При вводе иного символа никаких действий
выполняться не будет.
PageUp – В рабочей области отобразится “предыдущая страница”
документа, если она существует.
PageDown - В рабочей области отобразится “следующая страница”
документа, если она существует.
Home – Курсор перемещается в первую позицию строки консоли вне
зависимости от наличия в строке текста.
End – Курсор перемещается в последнюю позицию строки консоли вне
зависимости от наличия в строке текста.
Backspace – Удаляется символ, на который указывает курсор, и курсор
сдвигается на одну позицию влево. В крайней левой позиции символ не
удаляется.
Delete – Удаляется символ, на который указывает курсор, но сам курсор
не двигается по тексту.
Up – Курсор перемещается на строку вверх в пределах рабочей области.
При нажатии на «Up» на верхней строке рабочей области отобразится
“предыдущая страница” документа, если она существует. Курсор перейдёт на
нижнюю строку.
Down – Курсор перемещается на строку вниз в пределах рабочей
области. При нажатии на «Down» на нижней строке рабочей области
отобразится “следующая страница” документа, если она существует. Курсор
перейдёт на верхнюю строку.
Left – Курсор перемещается влево до конца экрана.
Right – Курсор перемещается вправо до конца экрана.
3. Ограничения при работе с программой и возможные сбои.

Большинство ошибок будет отображено в виде строки в области
информации редактора.

Программа работает только с кодировкой OEM. Любая другая
кодировка нелатинских символов может привести к неверному отображению
текста, а также невозможности его редактирования. При попытке
редактирования такого текста возможен сбой программы и потеря данных.

Желательно, чтобы курсор всегда находился в редактируемом
тексте, иначе возможно неверное определение позиции курсора при нажатии
символьной клавиши, в результате чего возможен сбой программы и потеря
данных.

Запрещено пролистывание вниз вновь созданного файла до тех
пор пока не будет автоматически создана новая страница документа. Это
может вызвать обращение к несуществующей ячейке памяти, в результате
чего возможен сбой программы и потеря данных.

Запрещено частое нажатие на управляющие клавиши. Это может
передать неверные данные, в результате чего возможен сбой программы и
потеря данных.
19

Возможен сбой программы при открытии 45 и выше страницы
документа. Желательно разбивать файлы такого объёма путём частичного
сохранения. Однако при этом может нарушится целостность документа.

Не желательно пользоваться дополнительной клавиатурой при
выключенной клавиши NumLock. Возможно будет выполнена нежелательная
операция.
4. Системные требования.
Операционная система: MS DOS или любая операционная система
семейства MS Windows
16 Мб оперативной памяти.
115 Кб свободного пространства на жестком диске.
Клавиатура.
Это программное обеспечение не поддерживает системы *Unix.
5. Установка.
Это программное обеспечение не требует установки и полностью готово
к работе при запуске CTE.exe
6. Контактная информация
По вопросам технического обслуживания и ремонта программного
обеспечения следует обращаться в информационно-вычислительный центр
НГТУ им.Алексеева (г.Нижний Новгород, Россия), либо к автору
программного обеспечения через сайт http://legach.ntl.nnov.ru/
7. Авторские права
Автор: Сидоренко Олег
Лицензия: Данный продукт распространяется под свободной лицензией
Дата создания продукта: 20.05.2011
20
Руководство программиста
1. Системные требования.
Операционная система: MS DOS или любая операционная система
семейства MS Windows
16 Мб оперативной памяти.
115 Кб свободного пространства на жестком диске.
Клавиатура.
Это программное обеспечение не поддерживает системы *Unix.
2. Установка.
Это программное обеспечение не требует установки и полностью готово
к работе при запуске CTE.exe
3. Среда разработки
Borland C++ 5.02
4. Компиляция
Компиляция производилась на 32-х разрядной системе MS Windows 7 со
стандартными опциями компилирования.
Были подключены стандартные библиотеки, поставляемые с
компилятором Borland C++ 5.02: stdio.h, conio.h, iostream.h, stdlib.h, string.h.
5. Контактная информация
По вопросам технического обслуживания и ремонта программного
обеспечения следует обращаться в информационно-вычислительный центр
НГТУ им.Алексеева (г.Нижний Новгород, Россия), либо к автору
программного обеспечения через сайт http://legach.ntl.nnov.ru/
6. Авторские права
Автор: Сидоренко Олег
Лицензия: Данный продукт распространяется под свободной лицензией
Дата создания продукта: 20.05.2011
7. Сценарий работы программы.
Запуск программы, запрос начальных данных от пользователя. Загрузка
файла, формирование рабочей области, области информации. Приём и
обработка данных от пользователя, пока не будет передано сообщение о
завершении работы.
8. Общие сведения о исходном коде программы.
Структура кода состоит из глобальных переменных, набора функций и
основной функции main. Глобальные переменные используются в
21
большинстве функций программы, т.к. функции меняют их все. В основном
меняются номера страниц, позиция курсора и строка текста.
9. Описание глобальных переменных.
char *scrs – основная строка. Содержит символы, отображающиеся
в данный момент в рабочей области.
char answ – символ, отправленный пользователем на какой либо
вопрос.
int *pagesize – массив размеров каждой из страниц.
int *posstdbuf – массив позиций в файле буфера. Эти значения
необходимы для определения начала страницы в файле stdbuf.
int pnum=0 – номер текущей страницы.
int *posfile – массив позиций в открытом файле. Эти значения
необходимы для определения начала страницы в открытом для работы файле.
int x,y – позиция курсора по X и Y соответственно.
int len_prev=0 – длина предыдущей страницы.
char c – символ, отправленный пользователем. Этот символ
программа обрабатывает по заданному алгоритму и выполняет действиерезультат в ответ на этот символ.
10.Количество выделенной памяти.
scrs: 1920 символов одновременно может отображаться в рабочей
области.
mask: 256 символов может содержать искомая строка.
fname: 256 символов может содержать имя файла.
posfile: 500 страниц теоретически может быть в открытом документе.
pagesize: 500 страниц теоретически может быть в открытом
документе.
posstdbuf: 500 страниц теоретически может быть в открытом
документе.
11.Описание функций.
int find(const char *str1,const char *str2);
Возвращает позицию первого вхождения строки str2 в строке str1. Если
совпадений нет, то возвращает отрицательное число. Поиск реализован
методом полного перебора символов.
char* del(char *src);
Возвращает строку с удалённым одним символом. Использует
глобальные переменные, содержащие в себе позицию курсора, с помощью них
определяет место в строке. Затем сдвигает массив символов к началу на одну
позицию, начиная с уже определённого места в строке. Здесь может быть сбой
программы, если пользователь поставит курсор вне текста.
char* add(char *src,char c);
22
Возвращает строку с добавленным одним символом. Использует
глобальные переменные, содержащие в себе позицию курсора, с помощью них
определяет место в строке. Затем сдвигает массив символов на одну позицию
к концу и в определённое место в строке вставляет символ c.
void down(char *fname, int pnum);
Заменяет основную строку на другую, содержащую следующую
страницу открытого документа, при этом предыдущая строка запишется в
буфер текста stdbuf. Использует массив позиций страниц в открытом файле.
pnum – номер страницы, которая будет открыта. Страница отобразится на
половину рабочей области для того, чтобы можно было добавить ещё столько
же символов, пока все они видны на одном экране.
char* up(int& pnum);
Заменяет основную строку на другую, содержащую предыдущую
страницу текстового буфера. Чтобы определить место начала страницы в
файле использует массив позиций *posstdbuf.
void save(void);
Сохраняет документ. Запрашивает имя сохраняемого документа, создаёт
его и блоками по 1024 байта копирует содержимое файла stdbuf в
сохраняемый. Именно поэтому, чтобы сохранить весь документ, следует
сначала просмотреть его на экране консоли, записывая содержимое экрана,
нажимая вниз.
void load(char *fname,char *set);
Загружает документ с параметром *set. Посимвольно заполняет
основную строку набором символов из открытого файла так, чтобы при
отображении основной строки на экране она уместилась на половину рабочей
области.
void message(char* s);
Отображение сообщений в области информации. Очистка этой строки, а
затем вывод на неё сообщения.
void output(char *source,int page,int x, int y);
Вывод основной строки с первой позиции курсора, отображение области
информации, затем установка курсора на место, заданное переменными x и y.
void help();
Вывод на экран краткой справочной информации из файла ReadMe.txt.
При нажатии затем любой клавиши восстановится документ, на котором вы
завершили работу.
void savetobuf(char *source, int pos);
Добавление в файл stdbuf строки source начиная с позиции pos.
int main(void);
Основная функция программы. Содержит выделение памяти для
глобальных переменных, а также цикл обработки данных. Цикл будет
завершён лишь при выходе из программы.
23
12.Обработка введённых данных.
Рассмотрим, что делает программа при нажатии каких-либо клавиш.
F1 – Вызов функции help()
F2 – Вызов функции save()
F3 – Очищение памяти из-под основной строки, запрос на способ
открытия файла и имя файла. В зависимости от выбранного способа файл
откроется с разными параметрами. Номер страницы выставится на значение 0.
F4 – Запрос на искомую строку. Выполнение функции find(),
определение позиции курсора на месте найденного значения.
ESC – Подтверждение закрытия программы, если пользователь ответил
‘y’, то очищение ранее выделенной памяти, очищение файла stdbuf.
PageUp – Вызов функции up().
PageDown – Вызов функции down()
Home – Значению x присваивается 1.
End – Значению x присваивается 80.
Backspace – Вызов функции del() и уменьшение значения x на единицу.
Delete – Вызов функции del(), значение переменных, определяющих
позицию курсора не меняется.
Up – Уменьшение значения y на единицу если y>1, иначе вызов
функции up() и операция присваивания: y=24.
Down – Увеличение значения y на единицу если y<24, иначе вызов
функции down() и операция присваивания: y=1.
Left – Уменьшение значения x на единицу.
Right – Увеличение значения x на единицу.
Other – Выполнение функции add().
13.Таблица сообщений программы.
Сообщение
001:Can't create stdbuf
002:Not memory.[scrs]
003:Not memory.[mask]
004:Not memory.[fname]
005:Not memory.[posfile]
Описание
Ошибки
Невозможно создать файл
буфера stdbuf. Возможно
недостаточно прав для совершения
этой операции.
Невозможно выделить память
для основной строки.
Невозможно выделить память
для строки, содержащей искомое
значение.
Невозможно выделить память
для строки с именем файла.
Невозможно выделить память
для массива, содержащего позиции
начала страниц в открытом файле.
24
006:Not memory.[pagesize]
007:Not memory.[posstdbuf]
008:Not memory.[load.scrs]
009:File not found.[load.fload]
010:stdFile not found.[save.stdbuf]
011:File not found.[save.fsave]
012:stdFile not found.[up.stdbuf]
013:Not memory.[up.scrs]
014:File not found.[down.fload]
015:Not memory.[down.scrs]
016:Not memory.[down.string]
017:ReadMe.txt not found.[help.fhelp]
018:Not memory.[load.string]
Невозможно выделить память
для массива, содержащего размеры
страниц документа
Невозможно выделить память
для массива, содержащего позиции
страниц в файле stdbuf
Невозможно выделить память
для основной строки в функции load()
Не может быть создан или
загружен файл в функции load().
Возможно недостаточно прав для
совершения этой операции.
Не был найден и/или открыт
файл буфера stdbuf. Возможно
недостаточно прав для совершения
этой операции.
Не может быть создан или
загружен файл в функции save().
Возможно недостаточно прав для
совершения этой операции.
Не был найден и/или открыт
файл буфера stdbuf. Возможно
недостаточно прав для совершения
этой операции.
Невозможно выделить память
для основной строки в функции up().
Не может быть загружен файл в
функции down(). Возможно файл был
удалён или программа имеет
недостаточно прав для совершения
этой операции.
Невозможно выделить память
для основной строки в функции
down().
Невозможно выделить память
для дополнительной строки в
функции down().
Не был найден и/или открыт
файл ReadMe.txt. Возможно файл был
удалён или программа имеет
недостаточно прав для совершения
этой операции.
Невозможно выделить память
для дополнительной строки в
25
функции load().
Вопросы и информационные сообщения
Просьба ввести имя файла, в
SAVE:Insert name of file:
котором будет сохранён документ.
Просьба ввести имя файла,
который должен быть загружен или
Insert name of file:
создан в зависимости от ответа на
предыдущее сообщение.
На экране не помещаются
Too many symbols! Please save text or
символы. Просьба сохранить текст
press 'down'
или нажать клавишу ‘вниз’.
Поиск искомой строки
Not found on this page
завершился неудачей на этой
странице.
Просьба ввести искомую
Find:
строку.
Вопрос при завершении работы
Are you sure? y/n
программы.
Вопрос: создать новый файл(y)
New file y/n?
или загрузить старый(other)
26
Разработка тестового примера.
Основные функции текстового редактора демонстрируется с помощью
двух примеров: создание нового файла и открытие уже созданного файла.
Пример 1.
Создание нового файла:
Добавление символов последовательно:
27
Перемещение курсора:
Добавление символа(***) в текст:
Удаление символов:
28
Сохранение текста:
Выход:
29
Пример 2.
Открытие файла:
30
Вставка символа(***) в текст:
31
Нажатие PageDown. Кодировка ANSI отображается некорректно.
Нажатие PageUp. Добавленные ранее символы отображаются на том же
месте.
Поиск:
32
Сохранение под другим именем. Сохранилась только первая страница.
Вызов функции help():
33
Примеры ошибок.
Добавление символа вне текста:
Пролистывание вниз вновь созданного файла:
34
35
Заключение.
Разработанный консольный текстовый редактор позволяет выполнять
поверхностную работу с документами, затрачивая минимальное количество
ресурсов. Универсальность проекта даёт право не ограничивать области его
применения
В проекте были затронуты все аспекты разработки продукта, включая
руководство пользователя и разработку тестовых примеров.
Поставленные цели были достигнуты
36
Список сокращений.
MS - Microsoft
WYSIWYG - What You See Is What You Get (англ. «Что видишь, то и
получишь»)
ПК – Персональный компьютер
ТР – Текстовый редактор
ФБА – Функционально близкие аналоги
37
Список используемой литературы.
Пахомов Б.И. C/C++ и MS Visual C++ 2008 для начинающих. – СПб.:
БХВ-Петербург, 2009.
Шилдт, Герберт. C++: методики программирования Шилдта. : Пер. с
англ. – М.: ООО «И.Д. Вильямс», 2009.
Ресурсы сети Интернет.
http://www.cyberguru.ru/cpp-sources/
http://www.cyberforum.ru/
http://lordn.narod.ru/download/books/walla/programming/Spr_po_C/main.htm
http://habrahabr.ru/
38
Приложение.
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
-------------------------------------------------------------------Filename: CTE.CPP
Abstract: Console Text Editor
Description: Editor of documents
Author: Sidorenko Oleg
Platform: Borland C++
*/
*/
*/
*/
*/
*/
*/
**
****** *****
****
***** ** **
****
****
*/
**
**
**
** ** **
** ** **
** **
** **
*/
**
****** ** *** ****** **
****** **
**
**
** */
**
**
**
** ** ** **
** ** **
*/
****** ****** ***** ** ** ***** ** **
******
*/
---------------------------------------------------------------------*/
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
char *scrs;//Основная строка
char answ;//Ответ на вопрос
int *pagesize;//Массив размеров страниц
int *posstdbuf;//Массив позиций начала страниц в файле буфере
int pnum=0;//Номер страницы
int *posfile;//Массив позиций начала страниц в файле
int x,y;//Координаты курсора
int len_prev=0;//Длина предыдущей страницы
char c;//Символ, обрабатываемый программой как основные данные
int find(const char *str1,const char *str2);//Поиск
char* del(char *src);//Удаление
char* add(char *src,char c);//Добавление
void down(char *fname, int pnum);//Страница ниже
char* up(int& pnum);//Страница выше
void save(void);//Сохранение
void load(char *fname,char *set);//Загрузка
void message(char* s);//Вывод сообщения
void output(char *source,int page,int x, int y);//Вывод основной
строки
void help();//Вывод справки
void savetobuf(char *source, int pos);//Сохранение в файл буфера
// Основная программа
int main(void)
{
clrscr();
char *fname;//Имя файла
char *mask;//Искомая строка
int curpos=0,i;//Текущая позиция в строке и счётчик
FILE *fload;//Загружаемый файл
FILE *stdbuf;//Файл буфера
//Очистка файла буфера
stdbuf=fopen("stdbuf","w+");
39
if(stdbuf==NULL){message("001:Can't create stdbuf");
getch();return 0;}
else fclose(stdbuf);
x=1;y=1;//Начальная позиция курсора
//Выделение памяти
scrs=(char*)calloc(1920,sizeof(char));
if(scrs==NULL){message("002:Not memory.[scrs]"); getch(); return
0;}
mask=(char*)calloc(256,sizeof(char));
if(mask==NULL){message("003:Not memory.[mask]"); getch(); return
0;}
fname=(char*)calloc(256,sizeof(char)); // IMPOTANT!!!
if(fname==NULL){message("004:Not memory.[fname]"); getch(); return
0;}
posfile=(int*)calloc(500,sizeof(int));
if(posfile==NULL){message("005:Not memory.[posfile]"); getch();
return 0;}
pagesize=(int*)calloc(500,sizeof(int));//max 500 pages;
if(pagesize==NULL){message("006:Not memory.[pagesize]"); getch();
return 0;}
posstdbuf=(int*)calloc(500,sizeof(int));
if(posstdbuf==NULL){message("007:Not memory.[posstdbuf]");
getch(); return 0;}
//Явное присваивание начальных значений
posfile[0]=0;posfile[1]=0;
pagesize[0]=0;
posstdbuf[0]=0;posstdbuf[1]=0;
pnum=1;
//Выбор способа открытия файла
message("New file y/n? ");
cin>>answ;
message("Insert name of file: ");
cin>>fname;
if(answ=='y') load(fname,"w+");
else load(fname,"r");
//Обработка данных
for (;;) {
//Бесконечный цикл до нажатия клавиши ESC
output(scrs,pnum,x,y); // Вывод на экран основной строки
gotoxy(x,y);//Переход на позицию курсора
c=getch(); //Запрос символа
if(c==0)//Если символ управляющий, то вначале возвращает ‘0’
{
c=getch();//Определение кода управляющего символа
switch (c) { //Выбор действия при нажатии определённой
клавиши
case (59): //f1
help();
break;
case (60): //f2
save();
break;
case (61): //f3
40
free(scrs);
message("New file y/n? ");
cin>>answ;
message("Insert name of file: ");
cin>>fname;
if(answ=='y') load(fname, "w+");
else
load(fname, "r");
pnum=0;//Обнуление страницы
break;
case (62): // F4
message("Find:");
cin>>mask;
curpos=find(scrs,mask);
//Обработка полученной позиции в строке
i=0; x=1; y=1;
if(curpos<0)//find()возвращает отрицательное значение, если
ничего не найдено
{message("Not found on this page");getch(); break;}
//Преобразование позиции в строке в позицию курсора
while(i!=curpos)
{
gotoxy(1,25);
if(scrs[i]=='\n'){x=1; y++;}
else x++;
if(x>80){x=1; y++;}
i++;
}
break;
case (71): // Home
x=1;
break;
case (79): // End
x=80;
break;
case (83): // Delete
scrs=del(scrs);
break;
case (72): //up
if (y>1) y--;
else
if (pnum>0) {pagesize[pnum]=strlen(scrs); pnum-;scrs=up(pnum);y=24;}//Если предыдущая страница существует.
break;
case (73): //pageup
if (pnum>0) {pagesize[pnum]=strlen(scrs); pnum-;scrs=up(pnum);}//Если предыдущая страница существует
break;
case (80):
//down
if (y<24) y++;
else {y=24; pagesize[pnum]=strlen(scrs); pnum++;
//Существуют ли ещё символы в файле?
fload=fopen(fname,"r");
fseek(fload,posfile[pnum],SEEK_SET);
fgetc(fload);
41
if(feof(fload)!=NULL) pnum--;//Если не существуют
else {down(fname,pnum);y=1;}//Если существуют
}
break;
case (81):
//pagedown
//Аналогично, как и при нажатии ‘down’
pagesize[pnum]=strlen(scrs); pnum++;
fload=fopen(fname,"r");
fseek(fload,posfile[pnum],SEEK_SET);
fgetc(fload);
if(feof(fload)!=NULL) pnum--;
else down(fname,pnum);
break;
case (82): break;
//insert. Иначе печатался бы символ
клавиши
case (77):
//right77
if (x<80) x++;
//!!!
break;
case (75):
//left80 75
if (x>1) x--;
break;
default:
// other
scrs=add(scrs,c);
if(x>79) {x=1;y++;}
else
x++;
}
//закончен первый switch
}//закончено условие if(c==0)
else // Если с!=0
switch (c) { //Эти клавиши не являются управляющими(имеют
только один код)
case (27): //esc
clrscr();
message("Are you sure? y/n ");
cin>>answ;
if(answ=='y'){
//очистка памяти
free(scrs);
free(posstdbuf);
free(mask);
free(pagesize);
free(posfile);
//Очистка файла
stdbuf=fopen("stdbuf","w+");fclose(stdbuf);
return 0; }
else break;
case (13):
// Enter
scrs=add(scrs,'\n');
if (y<23) y++;
else {pagesize[pnum]=strlen(scrs); pnum++;
down(fname,pnum); y=1;}//если Enter был нажат на последней строке
x=1;
break;
case (8):
// BackSpace
if (x>1) {
x--;
scrs=del(scrs);
42
}
break;
default:
// other
if((c>=32)&&(c<=126))//интервал символов по ASCII таблице:
[' ';'~']
{
scrs=add(scrs,c);
if(x>79) {x=1;y++;}
else
x++;
}
}//закончен второй switch
}//Закончен цикл for
} //Закончена функция main
//Вывод сообщения
void message(char* s)
{gotoxy(1,25);
cout<<"
строки
gotoxy(1,25);
cout<<s;
}
";//стирание
//Вывод основной строки
void output(char *source,int page,int x, int y) {
clrscr();
gotoxy(1,1);
cout<<source;
gotoxy(1,25);
cout<<"F1-help F2-save F3-load F4-Find ESC-exit
"<<x<<":"<<y<<"
page:"<<page;//Строка информации(Область информации)
gotoxy(x,y);
}
// Добавление символа
char *add(char *src,char c)
{
int position=0,size=strlen(src)+1;
int i,xpos=1,ypos=1;
if(y==1) position=x*y;//если курсор на первой строке
else
{i=0;
//преобразование позиции курсора в позицию в строке
while((xpos!=x)||(ypos!=y))
{
//gotoxy(1,25);
if(src[i]=='\n'){xpos=1; ypos++;}
else xpos++;
if(xpos>80){xpos=1; ypos++;}
position++;
i++;
}
}
43
if(position>strlen(src)) position=strlen(src);//если позиция в
строке получилась больше длины строки(курсор за пределами текста)
if(strlen(src)>1920)
message("Too many symbols! Please save text
or press \'down\'");//Длина строки больше 1920 символов
for(i=size+1;i>position;i--)
src[i]=src[i-1];//сдвиг части строки
src[i]=c;
return src;
}
//сохранение в файловый буфер
void savetobuf(char *source, int pos)
{
FILE *stdbuf;
stdbuf=fopen("stdbuf","r+");
fseek(stdbuf,pos,SEEK_SET);
fputs(source,stdbuf);
posstdbuf[pnum]=ftell(stdbuf);
fclose(stdbuf);
}
// Загрузка файла
void load(char *fname,char *set)
{ FILE *fload;
int i=0,kolvo=0;
free(scrs);
scrs=(char*)calloc(1920,sizeof(char));
if (scrs==NULL) {message("008:Not memory.[load.scrs]"); getch();
return;}
fload=fopen(fname,set);//Открытие файла
if (fload==NULL) {clrscr();message("009:File not
found.[load.fload]");scrs[i+1]='\0';getch(); return;}
if(set[0]=='r')//если открывается ранее созданный файл
{
while (!feof(fload)&&(kolvo<13))//Ровно половина экрана
{
char* string;
char c=' ';//Чтобы символ не сбивался
string=(char*)calloc(80,sizeof(char));
if (scrs==NULL) {message("018:Not memory.[load.string]");
getch(); return;}
i=0;
while ((i!=80)&&(c!='\n')) {c=fgetc(fload);string[i]=c;
i++;}//Посимвольное чтение строк из файла
strcat(scrs,string);//Склейка строк
kolvo++;//Сколько строк по 80 символов уже есть
free(string);
}
posfile[2]=ftell(fload);
fclose(fload);
len_prev=strlen(scrs);
}
else scrs[i+1]='\0';
}
//Сохранение
44
void save(void)
{
char *fname, tmp[1024];
FILE *fsave, *stdbuf;
int cnt;
savetobuf(scrs,posstdbuf[pnum]);//Сохранение текущей строки в
буфер
//Запрос на сохранение файла
message("SAVE:Insert name of file: ");
cin>>fname;
stdbuf=fopen("stdbuf","r");
if (stdbuf==NULL) {clrscr();message("010:stdFile not
found.[save.stdbuf]"); getch(); return;}
fsave=fopen(fname,"w+");
if (fsave==NULL) {clrscr();message("011:File not
found.[save.fsave]"); getch(); return;}
//Поблочное копирование
while (!feof(stdbuf)){
cnt = fread (&tmp,1,1024*sizeof(char),stdbuf);
fwrite(&tmp,1,cnt*sizeof(char),fsave);
}
fclose(fsave);
fclose(stdbuf);
}
// Предыдущая страница
char *up(int& pnumfn)
{
if(pnumfn==0){pnumfn=1; return scrs;}
FILE *stdbuf;
stdbuf=fopen("stdbuf","r");
if (stdbuf==NULL) {clrscr();message("012:stdFile not
found.[up.stdbuf]"); getch(); return " ";}
clrscr();
fseek(stdbuf, posstdbuf[pnumfn], SEEK_CUR);
free(scrs);
scrs=(char*)calloc(1920,sizeof(char));
if (scrs==NULL) {message("013:Not memory.[up.scrs]"); getch();
return " ";}
int i=0;
while (i<pagesize[pnumfn]) {c=fgetc(stdbuf); scrs[i]=c;
i++;}//Посимвольное копирование
fclose(stdbuf);
return scrs;
}
//Следующая страница
void down(char *fname, int pnum)
{
int kolvo=0;
clrscr();
savetobuf(scrs,posstdbuf[pnum-1]);//сохранение предыдущей
free(scrs);
FILE *fload;
fload=fopen(fname,"r");
45
if (fload==NULL) {clrscr();message("014:File not
found.[down.fload]"); getch(); return;}
fseek(fload,posfile[pnum],SEEK_SET);
scrs=(char*)calloc(1920,sizeof(char));
if (scrs==NULL) {message("015:Not memory.[down.scrs]"); getch();
return;}
//Аналогично в функции load()
while (!feof(fload)&&(kolvo<13))
{char* string;
char c='_';
string=(char*)calloc(80,sizeof(char));
if (string==NULL) {message("016:Not memory.[down.string]");
getch(); return;}
int i=0;
while ((i!=80)&&(c!='\n')&&(!feof(fload)))
{c=fgetc(fload);string[i]=c; i++;}
strcat(scrs,string);
kolvo++;
free(string);
}
posfile[pnum+1]=ftell(fload);
fclose(fload);
len_prev=strlen(scrs);
}
//Удаление
char* del(char *src) {
int position=0;
int i,xpos=1,ypos=1;
//Определение позиции аналогично функции add()
if(y==1) position=x*y;
else
{i=0;
while((xpos!=x)||(ypos!=y))
{
if(src[i]=='\n'){xpos=1; ypos++;}
else xpos++;
if(xpos>79){xpos=1; ypos++;}
position++;
i++;
}
}
if(position>strlen(src)) position=strlen(src);
for(i=position;i<strlen(src);i++)
src[i]=src[i+1];//Смещение строки к началу
return src;
}
//Вывод справки
void help()
{FILE *fhelp;
char c;
int i=0;
cout<<"Help:\n";
fhelp=fopen("ReadMe.txt","r");
46
if(fhelp==NULL) {message("017:ReadMe.txt not
found.[help.fhelp]"); return;}
while(!feof(fhelp)&&i<784){c=fgetc(fhelp); cout<<c;i++;}//Первые
784 символа файла.
getch();
}
//Поиск позиции первого вхождения
int find(const char *str1,const char *str2)
{ int i, j, k;
clrscr();
for(i=0; str1[i]!='\0'; i++) {
for(j=i, k=0; (str2[k]!='\0')&&(str1[j]==str2[k]); j++,
k++);
if((k>0)&&(str2[k+1]=='\0'))
return i;
}
return -1;
}
47
Download