Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ_ПРОГР.doc
Скачиваний:
33
Добавлен:
29.02.2016
Размер:
1.66 Mб
Скачать

Лабораторная работа № 18

Тема: «Работа с текстовыми файлами»

  1. Цель работы

1.1 Получение навыков в программировании ввода и вывода с использованием файлов.

1.2 Получение навыков обработки символьных данных, содержащихся в файлах.

  1. Техническое обеспечение

    1. Персональная ЭВМ IBM PC/286 и более поздних моделей.

    2. Клавиатура.

    3. Дисплей.

    4. Печатающее устройство.

  2. Программное обеспечение

    1. Операционная система Windows

    2. Система программирования Visual C++ версия 6.0 или Borland C++ версия 3.1 и более поздние версии.

  1. Постановка задачи

Создать текстовый файл и выполнить их обработку текста в файле согласно заданного варианта.

  1. Содержание отчета

5.1. Тема и цель работы.

5.2. Схема алгоритма решения задачи.

5.3. Текст программы.

5.4. Результаты выполнения программы.

  1. Общие сведения

Фундаментом понимания системы ввода-вывода языка С являются концепции потоков и файлов. Система ввода-вывода языка С поддерживает постоянный интерфейс независимо от устройства, к которому обращается программист. То есть система ввода-вывода языка С предоставляет уровень абстракции между программистом и аппаратурой. Данная абстракция называетсяпотоком, а собственно устройство называетсяфайлом. Важно знать, как они взаимодействуют между собой.

    1. Потоки

Хотя каждое устройство ввода-вывода ЭВМ отличается от другого, система ввода-вывода преобразует их в единое логическое устройство поток. Все потоки похожи своим поведением. Поскольку потоки не зависят от устройств, одни и те же функции могут записывать информацию в файл на диске и использоваться для записи на другое устройство, например, на консоль. Существуют два типа потоков –текстовыеидвоичные.

Текстовые потоки– это последовательность символов. В текстовых потоках некоторые символы могут преобразовываться согласно требованиям среды. Например, символ новой строки (‘\n’) может преобразовываться в пару «возврат каретки – перевод строки». Следовательно, может не быть однозначного соответствия между записываемыми и считываемыми символами и символами во внешнем устройстве.

Двоичный поток– это последовательность байт, имеющих однозначное соответствие с байтами во внешнем устройстве. То не возникает преобразование символов. Также число байт, записанных или прочитанных из внешнего устройства совпадает с числом байт во внешнем носителе. Тем не менее, может добавляться некоторое количество нулевых байт к двоичному потоку. Эти нулевые байты могут использоваться, например, для заполнения сектора диска

    1. Функции обработки символов

Функция

int isalnum(int ch);

возвращает ненулевое значение, если аргумент chявляется либо буквой алфавита (верхнего или нижнего регистра), либо цифрой. Иначе возвращается 0. Прототип находится в файлеcctype.h.

Функция

int isalpha(int ch);

возвращает ненулевое значение, если аргумент chявляется буквой алфавита (верхнего или нижнего регистров). В противном случае возвращается 0. Прототип находится в файлеcctype.h.

Функция

int isdigit(int ch);

возвращает ненулевое значение, если аргумент chявляется цифрой от 0 до 9, в противном случае возвращается 0. Прототип находится в файлеcctype.h.

Функция

int islower(int ch);

возвращает ненулевое значение, если аргумент chявляется в противном случае возвращается 0. Прототип находится в файлеcctype.h.

Функция

int ispunct(int ch);

возвращает ненулевое значение, если аргумент chявляется знаком препинания или пробелом, в противном случае возвращается 0. Прототип находится в файлеcctype.h.

Функция

int isspace(int ch);

возвращает ненулевое значение, если аргумент chявляется символом пробела, возврата каретки (‘\r’), горизонтальной табуляции (‘\t’), вертикальной табуляции (‘\v’), перевода формата (‘\f’) или новой строки (‘\n’), в противном случае возвращается 0. Прототип находится в файлеcctype.h.

Функция

int isupper(int ch);

возвращает ненулевое значение, если аргумент chявляется буквой верхнего регистра (от «A» до «Z»), в противном случае возвращается 0. Прототип находится в файлеcctype.h.

Функция

int tolower(int ch);

возвращает соответствующий нижнему регистру эквивалент символа ch, еслиch– это буква верхнего регистра. В противном случаеchостается неизменным. Прототип находится в файлеcctype.h.

Функция

int toupper(int ch);

возвращает соответствующий верхнему регистру эквивалент символа ch, еслиch– это буква нижнего регистра. В противном случаеchостается неизменным. Прототип находится в файлеcctype.h.

    1. Функции обработки строк

Функция

char *strcpy(char *str1, const char *str2);

используется для копирования содержимого строки str2в строкуstr1. Аргументstr2должен быть указателем на строку, оканчивающуюся нулевым символом. Функцияstrcpy()возвращает указатель на конец строкиstr1. Прототип функции находится в файлеstring.h.

Функция

char *strcat(char *str1, const char *str2);

конкатенирует (соединяет в цепочку) строку str1и копию строкиstr2. В конце модифицированной строкиstr1функция устанавливает нулевой символ. Нулевой символ, первоначально завершавший строкуstr1, замещается первым символом строкиstr2. Строкаstr2 остается без изменений. Функцияstrcat()возвращаетstr1.

Следует иметь в виду, что функция не производит проверки границ, пожтому программист должен позаботиться о том, чтобы строка str1была достаточно длинной и могла вместить кроме своего первоначального содержания еще и содержание строкиstr2.

Прототип находится в string.h.

Функция

char *strchr(const char *str, int ch);

возвращает указатель на первое вхождение символа chв строку, на которую указываетstr. Если символchне найден, возвращаетсяNULL. Прототип находится вstring.h.

П р и м е р. Следующая программа выведет строку «isatest»:

char *p;

p = strchr(“this is a test”);

printf(p);

return 0;

}

Функция

int strcmp(const char *str1, const char *str2);

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

ЧислоЗначение

Меньше 0 str1 меньшеstr2

  1. str1 равнаstr2

Больше 0 str1 большеstr2

Прототип находится в string.h.

Функция

size_t strcspn(const char *str1, const char *str2);

возвращает количество символов в начале строки с указателем str1, среди которых нет ни одного символа, входящего в строку с указателемstr2. Другими словами, для строкиstr1функцияstrcspn()возвращает значение индекса первого символа из числа символов, входящих в строкуstr2. Прототип находится вstring.h.

П р и м е р. Следующая программа выводит число 8:

#include <stdio.h>

#include <string.h>

int main(void)

{

int len;

len = strcspn(“this is a test”, “ab”);

printf(“%d”, len);

return 0;

}

Функция

char *strdup(const char str);

выделяет память, достаточную для хранения дубликата строки, на которую указывает str, а затем производит копирование этой строки в выделенную область и возвращает на нее указатель. Прототип находится вstring.h.

П р и м е р. Следующий фрагмент дублирует строку str:

char str[80], *p;

strcpy(str, “this is a test”);

p = strdup(str);

Функция

int stricmp(const char *str1, const char *str2);

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

ЧислоЗначение

Меньше 0 str1 меньшеstr2

  1. str1 равнаstr2

Больше 0 str1 большеstr2

Прототип находится в string.h.

П р и м е р. Следующая программа сравнивает имена двух файлов, заданных в командной строке:

#include <stdio.h>

#include <string.h>

int main(int argc, char *argv[ ])

{

if (!stricmp(argv[1], argv[2]))

printf(“Имена файлов одинаковы.\n”);

elseprintf(“Имена файлов различны\n”);

return 0;

}

Функция

size_t strlen(const char *str);

возвращает длину строки, оканчивающуюся нулевым символом, на которую указывает str. При определении длины строки нулевой символ не учитывается. Прототип находится вstring.h.

Функция

char *strlwr(char *str)

преобразует символы строки, на которую указывает str, в символы нижнего регистра. Функция возвращаетstr.

Функция

char *strrev(char *str);

Изменяет на обратную последовательность символов в строке (за исключением нулевого символа в конце строки), на которую указывает str. Функция возвращаетstr. Прототип находится вstring.h.

Функция

char *strstr(const char *str1, const char *str2);

возвращает указатель на первое вхождение в строку, на которую указывает str1, строки, на которую указываетstr2. Если совпадений не обнаружено, возвращаетсяNULL. Прототип находится вstring.h.

П р и м е р. Следующая программа выведет строку “itisatest”:

#include <stdio.h>

#include <string.h>

int main(void)

{

char *p;

p = strstr(“this is a test”, “is”);

printf(p);

return 0;

}

Функция

char *strupr(char *str);

преобразует символы строки, на которую указывает str, в символы верхнего регистра. Функция возвращаетstr. Прототип находится вstring.h.

  1. Варианты заданий

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

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

3) Создать текстовый файл, состоящий из 6 строк не более чем по 15 символов. Написать программу, выполняющую следующие функции:

  • подсчет общего количества символов;

  • подсчет числа цифровых и нецифровых символов;

  • подсчет частоты встречаемости последовательности символов “abc”.

4) Даны два символьных файла S1 иS2, содержащих слова, разделенные символом ‘/ ’. Создать файлS3, каждое слово которого образуется сцеплением слов из файловS1 иS2, у которых совпадают первые символы. Для разделения слов использовать пробел. Если не произошло ни одного сцепления, выдать сообщение: “ФайлS3 пуст”.

5) Дан символьный файл T. Группы символов, разделенные пробелами образуют слова.

Подсчитать количество слов в файле, найти самое длинное слово, подсчитать количество слов, состоящих из одного, двух, трех и т. д. символов.

6) Дан текстовый файл (файл состоящий из строк) F, содержащий программу на языке С. Проверить эту программу на несоответствие числа открывающихся и закрывающихся круглых скобок. Считать, что каждый оператор программы занимает не боле одной строки файлаF.

7) Дан текстовый файл F. Записать в перевернутом виде строки файлаFв файлG. Порядок строк в файлеGдолжен быть обратным по отношению к порядку строк исходного файлаF.

8) Дан файл F, компоненты которого являются целыми числами. Никакая из компонент файлаFне равна нулю. Числа в файле идут в следующем порядке: десять положительных, десять отрицательных, десять положительных, десять отрицательных и т. д. Число компонент файла должно быть кратно 40. Переписать компоненты файлаFв файлG, чтобы в файлеGчисла шли в следующем порядке: пять положительных, пять отрицательных, пять положительных, пять отрицательных и т. д.

9) Даны текстовый файл Fи строкаs. Получить все строки файла, содержащие в качестве фрагмента строкуs.

10) Даны два текстовых файла FиG. Определить, совпадают ли компоненты (строки) файлаFс компонентами файлаG. Если нет, то вывести номер первой строки и позицию первого символа в этой строке, в которых файлыFиGотличаются между собой.

11) Дан текстовый файл F, каждая строка в котором состоит из одного слова, размер которого не более 20 символов. Переписать этот файл, разместив слова в алфавитном порядке.

12) Дан символьный файл F. Считая, что количество символов в слове не превышает двенадцати, определить количество слов (слова отделяются пробелами) в файлеF; определить, сколько имеется в файле слов, соответственно, с одним, двумя, тремя и т. д. символами.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]