- •Методические указания к лабораторным работам
- •Лабораторная работа №1 простые программы с циклами и операторами консольного ввода/вывода
- •Задание
- •Описание примера
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №2 работа с текстовыми файлами, структурами данных и меню
- •Задание
- •Структурное программирование и функциональная декомпозиция системы
- •Функции
- •Организация меню в консольном приложении
- •Структуры данных
- •Операции с файлами
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №3 разработка и спецификация функций и модулей программы
- •Задание
- •Модульная структура программ
- •Параметры командной строки
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №4 разработка и спецификация структур данных, использование указателей и динамических массивов структур
- •Задание
- •Указатели
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №5 использование объектно-ориентированного программирования в разработке приложений
- •Задание
- •Конструкторы и деструкторы
- •Конструктор по умолчанию
- •Конструктор копирования
- •Массивы объектов
- •Friend-конструкции
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №6 использование наследования, полиморфизма и абстрактных классов
- •Задание
- •Наследование данных и методов
- •Полиморфизм и виртуальные функции
- •Абстрактный класс
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №7
- •Сложные структуры из объектов классов
- •Цель работы - изучение организации различных структур данных и разработка методов манипулирования данными.
- •Задание
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №8 разработка windows-интерфейса приложения
- •Задание
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Лабораторная работа №9 разработка и использование com-сервера
- •Задание
- •Шаблоны классов
- •Использование библиотеки atl для создания серверов сом
- •Методика выполнения
- •Содержание отчета
- •Контрольные вопросы
- •Литература
Операции с файлами
В заголовке stdio.h даны прототипы функций для работы с файлами. Там же определена специальная структура типа FILE, поля которой содержат системную информацию о файле, например, указатель на буфер обмена, размер буфера, флаги статуса файла и т. д. Пользователь может не знать подробности строения и использования системой этой структуры, но он должен описать переменную типа FILE* и использовать ее при вызове функций, оперирующих с файлами.
Действия по открытию файла могут быть, например, такими:
char *fn = "test.txt"; //Имя файла
FILE *fp; // Указатель па файловую структуру
while ((fp=fopen (fn, "rt"))= =NULL
if (YesNo ("Файл не найден. Выход ?")) exit(l);
В этом фрагменте поиск файла и попытка его открыть с помощью функции fopen осуществляются в цикле while. Тем самым мы даем возможность пользователю как-то исправить положение, если попытка оказалась неудачной. Например, вставить дискету. Предполагается, что функция YesNo, предоставляющая пользователю меню из двух альтернатив и возвращающая сделанный выбор, создана и доступна. В случае успеха указателю типа FILE* присваивается значение, возвращаемое библиотечной функцией fopen. Эта функция пытается найти и открыть файл с именем, задаваемым первым параметром, и связать поток ввода-вывода с указателем fp. Второй параметр определяет режим доступа. Он представляет собой константную строку текста, символы которой могут принимать следующие значения:
• r - открыть существующий файл только для чтения;
• r+ - открыть существующий файл для обновления (чтения и записи);
• w - создать для записи. Если файл с указанным именем уже существует, он будет разрушен;
• w+ - создать новый файл для обновления. Если файл уже существует, то он разрушается;
• а - открыть для записи в конец файла или создать для записи, если файл не существует;
• а+ —открыть (или создать) для чтения и записи, но в конец файла.
Чтобы указать компилятору, что данный файл открывается (создается) для чтения (записи) в текстовом формате (а не в двоичном), следует добавить символ t, например "rt", "w+t" и т. д.
Режим обработки чисел (binary mode) отмечается символом b, например, а+b, wb и т. д.
В случае успеха функция fopen возвращает указатель на вновь открытый поток. Если попытка оказалась неудачной, она возвращает NULL.
Библиотека ввода-вывода stdio.h имеет много других функций для более тонкой работы с файлами, например:
void rewind (FILE* stream); - переустанавливает указатель файла на начало потока;
int fseek(FILE *stream,long offset,int origin); - перемещает указатель в заданную позицию;
int fclose(FILE *stream); – закрывает файл;
char *fgets( char *string, int n, FILE *stream ); - чтение строки текста из потока, где
String- место размещения даны; N – максимальное количество символов, которые должны быть считаны; stream – указатель на структуру FILE;
int fgetc( FILE *stream ); - чтение символа из потока;
int fprintf( FILE *stream, const char *format [, argument ]...); - форматированный вывод в текстовый файл. Аналгогично printf, но первый параметр – указатель на файловую структуру;
int fputc( int c, FILE *stream ); - Вывод символа с в текстовый файл
FILE *stream;
char line[100];
if( (stream = fopen( "fgets.c", "r" )) != NULL )
{
while (feof( stream ) = = 0)
{
if( fgets( line, 100, stream ) = = NULL)
printf( "fgets error\n" );
else
printf( "%s", line);
}
fclose( stream );
}
Работа со строками
Строка в языке С/C++ представляет собой массив символов. Конец строки в массиве задается символом ‘\0’ (символ с кодом 0).
Примеры объявлений массивов символов:
char string[80];
char* title=”Diagram”;
Для определения длины строки используется функция int strlen( const char *string );:
char buffer[61] = "How long am I?";
int len = strlen( buffer );
Функция strcpy(char* str1,const char* str2) посимвольно копирует строку str2 в массив символов (строку) str1.
Функция strcat(char* str1,const char* str2) в конец строки str1 добавляет символы массива str2, включая завершающий ‘0’.
Функция strcmp(const char* str1,const char* str2) сравнивает в лексикографическом порядке 2 строки и возвращает целое число
<0 str1<str2,
0 str1==str2,
>0 str1>str2.
Функция _stricmp(string1,string2); сравнивает строки без учета регистра. Все символы считаются символами нижнего регистра.
Ввод строк с клавиатуры
Следующий фрагмент иллюстрирует достаточно надежный способ ввода с консоли значения текстовой строки (в данном случае массива Name):
char Name[30];
unsigned n; //Длина имени
char buf[80], *p; //Буфер ввода и указатель на начало строки
buf[0] = 30; // Ограничение на длину строки
р = cgets(buf); //Ввод в буфер
n = buf[l]; // Количество фактически введенных символов
if (n) // Если что-нибудь введено
{
strcpy(Name,p); // Копирование строки
}
Непосредственный ввод в буфер осуществляет функция cgets. Все остальные операторы обеспечивают надежность. Правила игры задает функция cgets. Она требует, чтобы предварительно в buf [0] было задано максимально допустимое количество символов в строке. Она помещает в buf[l] количество фактически введенных символов и возвращает указатель на начало строки. Сама строка размещается, начиная с buf[2], поэтому cgets присваивает переменной р адрес buf[2]. Далее в фрагменте выполняются следующие действия. Если количество введенных символов строки не равно нулю, то она копируется из буфера в строку Name. Надежность ввода обеспечивается тем, что пользователь может нажимать любое количество любых клавиш (по одной), и при этом программа не будет вести себя непредсказуемым образом.
Преобразование строки в число
Для преобразования используется функция sscanf. В отличие от scanf она имеет 3 параметра. Первый параметр задает строку, которую необходимо преобразовать.
char s[81], c, s2[] = "15 12 14...";
int i;
float fp;
sscanf(s2, "%80s", s ); // max 80 character string
sscanf(s2, "%c", &c );
sscanf(s2, "%d", &i );
sscanf(s2, "%f", &fp );
Обратное преобразование можно выполнить с помощью функции sprintf. В отличие от printf первый параметр задает результирующую строку.