МИНОБРНАУКИ РОССИИ
Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования
«Чувашский государственный университет имени И.Н. Ульянова»
Факультет информатики и вычислительной техники Кафедра компьютерных технологий
КУРСОВОЙ ПРОЕКТ
Дисциплина: «Программирование на языках высокого уровня» Тема: «Текстовые файлы в С++»
Выполнил: студент гр. КТ-43-15
Сергеев Аркадий
Проверил: ст. преподаватель кафедры КТ Мытникова Е. А.
Чебоксары 2016
СОДЕРЖАНИЕ Глава 1. СИМВОЛЬНЫЕ ДАННЫЕ 4
1.4. Обработка символов 7 Глава 2. ФАЙЛОВЫЕ СТРУКТУРЫ ДАННЫХ 11
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 14 Приложение А 15 Приложение Б 16 Приложение В 17 |
||||||||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
|||||||
|
|
|
|
|
||||||||
|
|
№ докум. |
Подпись |
Дата |
||||||||
Разраб. |
Сергеев А. С. |
|
|
Кафедра компьютерных технологий |
Лит. |
Лист |
Листов |
|||||
Провер. |
Мытникова Е.А.. |
|
|
|
|
|
2 |
17 |
||||
Реценз. |
|
|
|
Чувашский государственный уни- верситет имени И.Н.Ульянова |
||||||||
Н. Контр. |
|
|
|
|||||||||
Утверд. |
|
|
|
Цель работы: овладеть навыками алгоритмизации и программирования задач, обрабатывающих символьные данные; ввода и вывода символьных данных, их обработки; научиться использовать функции обработки символь- ных данных; овладеть навыками алгоритмизации и программирования фай- ловых структур данных; научиться проектировать структуры файла, запись данных в файл, ввод данных из файла. Задания
а) правила записи символьных данных (констант, переменных, масси- вов) и их описание; б) способы ввода и вывода символьных данных; в) способы обработки символьных данных; г) использование функций обработки символьных данных; д) правила составления программ с использованием символьных дан- ных; е) основную терминологию, связанную с файловыми структурами дан- ных. ж) возможности языка программирования по обработке файла с после- довательной организацией записи данных в файл, ввод из файла до записи данных в файл и т.п.
|
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
3 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
ГЛАВА 1. СИМВОЛЬНЫЕ ДАННЫЕ
1.1. Представление символов в С++
Любой текст состоит из символов. Для хранения одного символа пред- назначен тип данных char. Переменную типа char можно рассматривать дво- яко: как целое число, занимающее 1 байт и способное принимать значения от 0 до 255 (тип unsigned char) или от -128 до 127 (тип signed char) и как один текстовый символ. Сам же тип char может оказаться как знаковым, так и без- знаковым, в зависимости от операционной системы и компилятора. Поэтому использовать тип char не рекомендуется, лучше явно указывать будет ли он знаковым (signed) или беззнаковым (unsigned). Как и целые числа, данные типа char можно складывать, вычитать, умножать, делить, а можно выводить на экран в виде одного символа. Если же нужно вывести числовое значение символа (также называемое ASCII- кодом), то значение символа необходимо преобразовать к типу int. Текстовую строку можно представить, как массив символов типа char, но в языке C++ для хранения текстовых строк был создан более удобный тип string. По сути, тип данных string и является массивом символов. Напри- мер, если мы объявили переменную S как string S, а затем присвоили ей зна- чение "школа" (текстовые строки заключаются в двойные кавычки), то мы можем обращаться к отдельным символам строки S, представляя S, как мас- сив символов, например, S[0]=='ш', S[1]=='к' и т.д. Строковые данные можно считывать с клавиатуры, выводить на экран, присвавать переменным типа string. Также строки можно складывать друг с другом: например, при сложении строк "Hello, " и "world!" получится стро- ка "Hello, world!". Такая операция над строками называется конкатенацией. Для представления текстовой информации в языке С++ используются символы (константы), символьные переменные и строки (строко- вые константы), для которых в языке С++ не введено отдельного типа в от- личие от некоторых других языков программирования. |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
4 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
1.2. Описание символьных переменных
Для символьных данных в С++ введен тип char. Например:
const char c = 'c'; // символ – занимает 1 байт, значение не меняется char a, b; // переменные, занимают по одному байту, значения меняются const char *s = "Пример строки\n"; //текстовая константа Строка – это последовательность символов, заключенная в двойные ка- вычки (" "). Размещая строку в памяти, транслятор автоматически добавляет в ее конце символ '\0' (нулевой символ или нулевой байт, который является при- знаком конца строки). В записи строки может быть и один сим- вол: "А" (заключен в двойные кавычки), однако, в отличие от символьной константы 'А' (используются апострофы), длина строки "А" равна 2 байтам. В языке С++ строка – это пронумерованная последовательность симво- лов (массив символов), она всегда имеет тип char[]. Все символы строки ну- меруются, начиная с нуля. Символ конца строки также нумеруется – ему со- ответствует наибольший из номеров. Таким образом, строка считывается значением типа "массив символов". Количество элементов в таком массиве на 1 больше, чем изображение соответствующей строки, так как в конец строки добавлен нулевой символ '\0' (рис. 1.1).
Рис. 1.1. Представление строки и символа
Символьная строка в программном коде может располагаться на не- скольких строках. Для переноса используется символ '\' с последующим нажатием клавиши ввод. Символ '\' игнорируется компилятором, и следую- щая строка считается продолжением предыдущей. |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
5 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Присвоить значение строке с помощью оператора присваивания нельзя, так как для массивов не определена операция прямого присваивания. Поме- стить строку в символьный массив можно либо при вводе, либо с помощью инициализации: char s1[] = "ABCDEF"; // инициализация строки
char s2[]={'A','B','C','D','E','F','\0'}; // инициализация строки
Операция вычисления размера (в байтах) sizeof действует для объек- тов символьного типа и строк. char s1[10]="string1"; int k=sizeof(s1);
getchar() – функция (без параметров) используется для ввода одиночно- го символа из входного потока. Она возвращает 1 байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла. putchar(ch) – функция используется для вывода одиночного символа, то есть помещает в стандартный выходной поток символ ch. Аргументом функ- ции вывода может быть одиночный символ (включая знаки, представляе- мые управляющими последовательностями), переменная или функция, зна- чением которой является одиночный символ.
gets(s) – функция, которая считывает строку s из стандартного потока до появления символа '\n', сам символ '\n' в строку не заносится. puts(s) – функция, которая записывает строку в стандартный поток, до- бавляя в конец строки символ '\n', в случае удачного завершения возвраща- ет значение больше или равное 0 и отрицательное значение ( EOF = -1 ) в случае ошибки. |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
6 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
cin – оператор, который определяет стандартные потоки ввода данных. cout – оператор, который определяет стандартные потоки выво- да данных. << – операция записи данных в поток; >> – операция чтения данных из потока.
printf() – функция, осуществляющая форматированный вывод данных. scanf() – функция, осуществляющая форматированный ввод данных. %c – спецификатор формата ввода-вывода одиночного символа. %s – спецификатор формата ввода-вывода строки символов.
1.4. Обработка символов
Числовая и символьная интерпретация типа данных char позволяются использовать обычные операции для работы с целыми числами для обработ- ки символов текста. Тип данных char не имеет никаких ограничений на вы- полнение операций, допустимых для целых переменных: от операций срав- нения и присваивания до арифметических операций и операций с отдельны- ми разрядами. Но за исключением редких случаев знание кодов символов не требуется. Для представления отдельных символов можно пользоваться сим- вольными (литерными) константами. Транслятор вместо такой константы всегда подставляет код соответствующего символа: char c;
for (c= 'A'; c <= 'Z'; c++) ...
for (c=0x41; c <=0x5A; c++) ...
Имеется ряд кодов так называемых неотображаемых символов, кото- рым соответствуют определенные действия при вводе-выводе. Например, символу с кодом 1310 (0x0D) – «возврат каретки» соответствует перевод кур- |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
7 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
сора в начало строки. Для их представления в программе используются сим- вольные константы, начинающиеся с обратной косой черты. Некоторые программы и стандартные функции обработки символов и строк (isdigit, isalpha) используют тот факт, что цифры, прописные и строч- ные (маленькие и большие) латинские буквы имеют упорядоченные по воз- растанию значения кодов: '0' - '9' 0x30 - 0x39
'A' - 'Z' 0x41 - 0x5A
'a' - 'z' 0x61 - 0x7A
Рис. 1.2. Состав отображаемых символов ASCII (code page 866) Отображаемые символы в таблице ASCII начинаются с кода 32 (0x20), которому соответствует символ "пробел". Коды больших русских букв начи- наются с кода 128 (0x80), однако буква ' Ё ' расположена не на своем месте. Наблюдается разрыв в числовой последовательности кодов малых букв – по- сле буквы ' п ' расположена группа кодов псевдографики. С их помощью в текстовом режиме работы дисплея строятся одинарные и двойные контуры таблиц. Значения однобайтовых символьных констант заключаются в одинар- ные кавычки и могут быть заданы тремя способами. Первый распространяет- |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
8 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
ся на отображаемые символы таблицы ASCII (см. рис. 1.2) и заключается в том, что отображаемый символ заключается в одинарные кавычки: 'F', '%', '$', 'ы', '5', '+', '"', 'q', 'Я', ' '
Второй способ заключается в записи шестнадцатеричного кода символа после знака "обратный слэш": '\x27' (код символа "апостроф", 39) '\x5C' (код символа \, 92) Таблица 1.1 – Функции для работы с символьными данными |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
9 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Функция
Выполняемое
действие strlen(CS)
Возвращает
количество символов в строке S strdup(CS)
Запрашивает
память, копирует туда содержимое CS
и возвра- щает указатель типа char*
на новую строку strcpy(S1,
CS2)
Копирует
содержимое CS2
в S1,
возвращает указатель на S1 strncpy(S1,
CS2, k)
Копирует
первые k
символов из CS2
в S1,
возвращает указа- тель на S1 stpcpy(S1,
CS2)
Копирует
CS2
в S1,
возвращает указатель на конец S1 strset(S,ch)
Расписывает
строку S
символом ch,
возвращает указатель на S strnset(S,ch,k)
Повторяет
k
раз символ ch
в строке S,
возвращает указатель на S1 strcat(S1,
CS2)
Приписывает
содержимое CS2
в конец S1,
возвращает указа- тель на S1 strncat(S1,
CS2,k)
Присоединяет
первые k
символов CS2
к содержимому S1,
воз- вращает указатель на S1 strlwr(S)
замена
символов строки S
кодами малых букв, действует толь- ко
на буквы латинского алфавита strupr(S)
замена
символов строки S
кодами больших букв, действует только
на буквы латинского алфавита strrev(S)
Перестановка
символов строки S
в обратном порядке
strtol(CS,
ptr, r)
Число,
представленное в символьном виде в
CS
и записанное в системе счисления с
основанием r,
преобразуется в машинный формат числа
типа long.
В указатель
ptr заносится адрес сим- вола, прервавшего
преобразования. strtoul(CS,
ptr, r)
Аналогичное
преобразование в длинное целое число
без знака strtod(CS,
ptr)
Преобразование
вещественного числа из символьного
пред- ставления в машинный формат
числа типа double. strcmp(CS1,
CS2)
Возвращаемое
значение равно 0, если CS1
= CS2,
больше 0, если CS1
> CS2,
и меньше 0, если CS1
< CS2 strncmp(CS1,
CS2,k)
Сравниваются
только первые k
символов строк CS1
и CS2
Продолжение Таблицы 1.1 |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
10 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
Функция
Выполняемое
действие stricmp(CS1,
CS2)
При
сравнении игнорируется разница между
кодами больших и малых
букв strcmpi(CS1,
CS2)
Аналогичная
операция, разница только в названии
функций strnicmp(CS1,
CS2,k)
Сравнение первых
k
символов с игнорированием разницы
между кодами больших и малых
букв strncmpi(CS1,
CS2, k)
Аналогичная
операция, разница только в названии
функций strchr(CS,
ch)
Строка
CS
сканируется слева направо до обнаружения
симво- ла ch. strrchr(CS,
ch)
Аналогичный
поиск с конца строки CS strstr(CS1,
CS2)
Поиск
первого вхождения строки CS2
в строку CS1. strpbrk(CS1,
CS2)
В
строке CS1
ищется первый символ, содержащийся
в CS2 strspn(CS1,
CS2)
Определяется
длина начального фрагмента CS1,
целиком со- стоящая из символов CS2 strcspn(CS1,
CS2)
Определяется
длина начального фрагмента CS1,
который не содержит ни одного символа
из CS2 strtok(S1,
CS2)
Поиск
в строке S1
лексем, разделенных символами CS2
ГЛАВА 2. ФАЙЛОВЫЕ СТРУКТУРЫ ДАННЫХ
Большинство компьютерных программ работают с файлами, и поэтому возникает необходимость создавать, удалять, записывать читать, открывать файлы. Для работы с файлами необходимо подключить заголовочный файл <fstream>. В <fstream> определены несколько классов и подключены заголо- вочные файлы <ifstream> — файловый ввод и <ofstream> — файловый вы- вод. Файловый ввод/вывод аналогичен стандартному вводу/выводу, един- ственное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объек- тов cin и cout, то для организации файлового ввода/вывода достаточно со- здать собственные объекты, которые можно использовать аналогично опера- торам cin и cout. Для того, чтобы, создать текстовый файл и записать в него строку необходимо проделать следующие шаги:
ofstream /*имя объекта*/; // объект класса ofstream
Объект необходим, чтобы можно было выполнять запись в файл. Объ- ект необходимо связать с файлом, в который нужно записать строку. fout.open(имя_файла); // связываем объект с файлом
Указанный файл будет создан в текущей директории с программой. Ес- ли файл с таким именем существует, то существующий файл будет заменен новым. |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
11 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |
fout << "Данные"; // запись строки в файл
Используя операцию передачи в поток совместно с объектом fout стро- ка Работа с файлами в С++ записывается в файл. Так как больше нет необхо- димости изменять содержимое файла, его нужно закрыть, то есть отделить объект от файла. fout.close(); // закрываем файл
Шаги 1 и 2 можно объединить, то есть в одной строке создать объект и связать его с файлом. Делается это так: Ofstream fout(имя_файла); // создаём объект класса ofstream и связыва- ем его с файлом cppstudio.txt Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:
ifstream fin(имя_файла); // открыли файл для чтения fin.getline(buff, n); // считали строку из файла fin.close(); // закрываем файл
При помощи функции getline() считывается строка, длинной n симво- лов. Для того, чтобы, работа программы не завершилась ошибкой, в случае отсутствия файла, в С++ предусмотрена такая функция — is_open(), которая возвращает целые значения: 1 — если файл был успешно открыт, 0 — если файл открыт не был. if (!fin.is_open()) // если файл не открыт
cout << "Файл не может быть открыт!\n"; // сообщить об этом
else
fin.getline(buff, n); // считали строку из файла |
||||||
|
|
|
|
|
КП 09.03.03.4315.013 ПЗ |
Лист |
|
|
|
|
|
12 |
|
Изм. |
Лист |
№ докум. |
Подпись |
Дата |