Добавил:
По своей натуре перфекционист. Поэтому люблю все аккуратно оформлять и упорядочивать, складывать по полочкам. Вот, не пропадать же добру, нажитому за четыре кропотливых семестра. Тут я выложил все мои ответы, курсовые, отчеты и некоторые ДЗ. Они могут вам помочь для получения зачета или сдачи экзамена. Если чего-то не нашли в папочках, то попытайте удачу в разделе НЕОТСОРТИРОВАННОЕ на моей страничке, там все 4 семестра разложены по папкам. ГРУППА КТ-43-15. Годы обучения 2015-2019. Коллекция будет пополняться. Что ж, удачки :З Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
65
Добавлен:
15.09.2017
Размер:
223.99 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«Чувашский государственный университет имени И.Н. Ульянова»

Факультет информатики и вычислительной техники Кафедра компьютерных технологий

КУРСОВОЙ ПРОЕКТ

Дисциплина: «Программирование на языках высокого уровня» Тема: «Текстовые файлы в С++»

Выполнил: студент гр. КТ-43-15

Сергеев Аркадий

Проверил: ст. преподаватель кафедры КТ Мытникова Е. А.

Чебоксары 2016

СОДЕРЖАНИЕ

Глава 1. СИМВОЛЬНЫЕ ДАННЫЕ 4

    1. Представление символов в С++ 4

    2. Описание символьных переменных 5

    3. Ввод-вывод символьных данных и строк 6

      1. Ввод-вывод одиночного символа 6

      2. Ввод-вывод стандартного текстового (символьного) потока 6

      3. Стандартные потоки ввода-вывода символьных данных и строк 7

      4. Форматированный ввод-вывод символьных данных и строк 7

1.4. Обработка символов 7

Глава 2. ФАЙЛОВЫЕ СТРУКТУРЫ ДАННЫХ 11

    1. Чтение и запись в файл 11

    2. Режимы открытия файлов 13

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 14

Приложение А 15

Приложение Б 16

Приложение В 17

КП 09.03.03.4315.013 ПЗ

докум.

Подпись

Дата

Разраб.

Сергеев А. С.

Кафедра компьютерных технологий

Лит.

Лист

Листов

Провер.

Мытникова Е.А..

2

17

Реценз.

Чувашский государственный уни- верситет имени И.Н.Ульянова

Н. Контр.

Утверд.

Цель работы: овладеть навыками алгоритмизации и программирования задач, обрабатывающих символьные данные; ввода и вывода символьных данных, их обработки; научиться использовать функции обработки символь- ных данных; овладеть навыками алгоритмизации и программирования фай- ловых структур данных; научиться проектировать структуры файла, запись данных в файл, ввод данных из файла.

Задания

  1. Изучить:

а) правила записи символьных данных (констант, переменных, масси- вов) и их описание;

б) способы ввода и вывода символьных данных; в) способы обработки символьных данных;

г) использование функций обработки символьных данных;

д) правила составления программ с использованием символьных дан-

ных;

е) основную терминологию, связанную с файловыми структурами дан-

ных.

ж) возможности языка программирования по обработке файла с после- довательной организацией записи данных в файл, ввод из файла до записи данных в файл и т.п.

  1. Разработать алгоритм решения в соответствии с заданием.

  2. Составить программу решения задачи.

  3. Подготовить тестовый вариант программы и исходных данных.

КП 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);

    1. Ввод-вывод символьных данных и строк

      1. Ввод-вывод одиночного символа

getchar() – функция (без параметров) используется для ввода одиночно- го символа из входного потока. Она возвращает 1 байт информации (символ) в виде значения типа int. Это сделано для распознавания ситуации, когда при чтении будет достигнут конец файла.

putchar(ch) – функция используется для вывода одиночного символа, то есть помещает в стандартный выходной поток символ ch. Аргументом функ- ции вывода может быть одиночный символ (включая знаки, представляе- мые управляющими последовательностями), переменная или функция, зна- чением которой является одиночный символ.

      1. Ввод-вывод стандартного текстового (символьного) потока

gets(s) – функция, которая считывает строку s из стандартного потока до появления символа '\n', сам символ '\n' в строку не заносится.

puts(s) – функция, которая записывает строку в стандартный поток, до- бавляя в конец строки символ '\n', в случае удачного завершения возвраща- ет значение больше или равное 0 и отрицательное значение ( EOF = -1 ) в случае ошибки.

КП 09.03.03.4315.013 ПЗ

Лист

6

Изм.

Лист

докум.

Подпись

Дата

      1. Стандартные потоки ввода-вывода символьных данных и строк

cin – оператор, который определяет стандартные потоки ввода данных. cout – оператор, который определяет стандартные потоки выво-

да данных.

<< – операция записи данных в поток;

>> – операция чтения данных из потока.

      1. Форматированный ввод-вывод символьных данных и строк

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. ФАЙЛОВЫЕ СТРУКТУРЫ ДАННЫХ

    1. Чтение и запись в файл

Большинство компьютерных программ работают с файлами, и поэтому возникает необходимость создавать, удалять, записывать читать, открывать файлы.

Для работы с файлами необходимо подключить заголовочный файл

<fstream>. В <fstream> определены несколько классов и подключены заголо- вочные файлы <ifstream> — файловый ввод и <ofstream> — файловый вы- вод.

Файловый ввод/вывод аналогичен стандартному вводу/выводу, един- ственное отличие – это то, что ввод/вывод выполнятся не на экран, а в файл. Если ввод/вывод на стандартные устройства выполняется с помощью объек- тов cin и cout, то для организации файлового ввода/вывода достаточно со- здать собственные объекты, которые можно использовать аналогично опера- торам cin и cout.

Для того, чтобы, создать текстовый файл и записать в него строку необходимо проделать следующие шаги:

      1. создать объект класса ofstream;

      2. связать объект класса с файлом, в который будет производиться запись;

      3. записать строку в файл;

      4. закрыть файл.

ofstream /*имя объекта*/; // объект класса ofstream

Объект необходим, чтобы можно было выполнять запись в файл. Объ- ект необходимо связать с файлом, в который нужно записать строку.

fout.open(имя_файла); // связываем объект с файлом

Указанный файл будет создан в текущей директории с программой. Ес- ли файл с таким именем существует, то существующий файл будет заменен новым.

КП 09.03.03.4315.013 ПЗ

Лист

11

Изм.

Лист

докум.

Подпись

Дата

fout << "Данные"; // запись строки в файл

Используя операцию передачи в поток совместно с объектом fout стро- ка Работа с файлами в С++ записывается в файл. Так как больше нет необхо- димости изменять содержимое файла, его нужно закрыть, то есть отделить объект от файла.

fout.close(); // закрываем файл

Шаги 1 и 2 можно объединить, то есть в одной строке создать объект и связать его с файлом. Делается это так:

Ofstream fout(имя_файла); // создаём объект класса ofstream и связыва- ем его с файлом cppstudio.txt

Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:

  1. создать объект класса ifstream и связать его с файлом, из которого будет производиться считывание;

  2. прочитать файл;

  3. закрыть файл.

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

Изм.

Лист

докум.

Подпись

Дата