- •Управление esc – последовательность (с примерами)
- •4. Определение констант и их характеристика (const,define,enum)
- •5. Форматные потоки в с. Функции fPrintf(), Fscanf(), и модификации (с примерами). Спецификаторы
- •7. Перегруженные операции.
- •8. Инструкция ветвления. (пример)
- •9. Инструкция switch()
- •10. Применение инструкции switch() для создания текстового меню.
- •11. Инструкция цикла.
- •12. Инструкция перехода.
- •13. Указатели. Операции над указателями. Косвенная адресация.
- •14. Ссылки (пример)
- •15. Статические числовые одномерные
- •16. Статические числовые двумерные массивы.
- •17. Динамическая память.
- •18. Выделение памяти под динамический одномерный и двумерный массив.
- •19. Алгоритм удаления и добавления данных в массив.
- •20. Глобальные, локальные, статические, внешние переменные.
- •21. Классы памяти.
- •22. Формальные и фактические параметры.
- •23. Функции.
- •24. Виды передачи параметров в функцию.
- •25.Функции и массивы
- •26. Функции с переменным числом параметров.
- •27. Шаблоны функции.
- •28.Рекурсии. Фреймы.
- •29. Функция Main()
- •30. Стеки.
- •31. Очереди.
- •33. Строки, как массив символов.
- •34. Функции ввода строковых переменных.
- •35.Основные функции обработки строковых переменных.
- •37. Функции преобразования типов.
- •38. Строки типа string.
- •40. Функции работы с памятью. Memcmp - сравнивает две области памяти
- •41. Структуры
- •42. Вложенные структуры.
- •43. Объединения (union)
- •44.Передача переменных определенных пользователем в функцию.
- •50. Функция определения конца файла.
- •51. Файловый поток.
- •52. Функции tellg и ftell
- •53. Установка файлового указателя
- •55. Обработка текстовых файлов.
- •56. Бинарный файл.
42. Вложенные структуры.
Структуры. Структура - это одна или несколько переменных одного или различных типов, кот-е для удобства работы сгрупированны в одну языковую конструкцию, под одним именем.
struct date/*назв. структуры*/
{ int day; int month;} today;/*назв. переменной*/ //объявление структуры.
struct date d1, d2, d3; - несколько структурных переменных в одной. Инициализация структуры, содержащей информацию о музыкальной коллекции на CD. Struct cd_info {char title[25]; char artist[20]; int num_songs; float price; char date_bought[8];} cd[10];/*массив структур */ cd_info cd={“Red Moon Men”,“Sam and the Snuds”,12,11.95, “02/13/97” };
Вложенные структуры. Sruct Date
{int mounth;int day; int year;};
struct PersonInfo {float height;float weight;
Date birthday;}person;
Чтобы получить доступ к переменной birthday - члену person нужно использовать операцию «точка»: person.birthday, но т.к. эта переменная в свою очередь является переменной структурного типа Date, то доступ, например, к году рождения будет добавлением операции «точка» к имени year: person.birthday. year.
43. Объединения (union)
Объединение (union) представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как у структуры, только вместо ключевого слова struct используется слово union.
Длина объединения равна наибольшей из длин его полей. В каждый момент времени в переменной типа объединение хранится только одно значение, и ответственность за его правильное использование лежит на программисте.
Объединения применяют для экономии памяти, а также для разной интерпретации одного и того же битового представления:
struct Options {
bool centerX:1;
bool centerY:1;
unsigned int shadow:2;
unsigned int palette:4;
};
union {
unsigned char ch;
Options bit;
}option={0xC4};
cout << option.bit.palette;
option.ch &= 0xF0;// наложение маски
По сравнению со структурами на объединения налагаются некоторые ограничения:
-
объединение может инициализироваться только значением его первого элемента;
-
объединение не может содержать битовые поля;
-
объединение не может содержать виртуальные методы, конструкторы, деструкторы и операцию присваивания;
-
объединение не может входить в иерархию классов.
44.Передача переменных определенных пользователем в функцию.
См. 24
47. Обработка файлов в стиле с++
Рассмотрим теперь пример программы считывания информации из файла.
Листинг 5.2. Считывание текстовой информации из файла.
#include
int main()
{ char str_file[100];
FILE* fp = fopen(“my_file.txt”,”r”);
if(fp != NULL)
{ int i=0;
char ch;
while((ch = getc(fp)) != EOF)
str_file[i++]=ch;
str_file[i] = ‘\0’;
printf(str_file); }
else printf(“Невозможно открыть файл на чтение.\n”);
fclose(fp);
return 0; }
В приведенном листинге функция fopen() открывает файл на чтение, что определяется значением второго аргумента равного «r». Это значит, что в него невозможно произвести запись данных, а только считывание. Сначала выполняется цикл while, в котором из файла считывается символ с помощью функции getc() и выполняется проверка: если считанное значение не равно символу конца файла EOF, то значение переменной ch записывается в массив str_file. Данный цикл будет выполняться до тех пор, пока не будут считаны все символы из файла, т.е. пока не будет достигнут символ EOF. После завершения цикла формируется строка str_file, которая выводится на экран с помощью функции printf(). Перед завершением программы также выполняется функция закрытия файла fclose().
Работа с текстовыми файлами через функции putc и getc не всегда удобна. Например, если необходимо записать или считать строку целиком, то желательно иметь функции, выполняющие эту работу. В качестве таковых можно воспользоваться функциями fputs() и fgets() для работы со строками. Перепишем предыдущие примеры с использованием данных функций.
Листинг 5.3. Использование функций fpust() и fgets().
#include
int main()
{ char str_file[]=”Строка для файла”;
FILE* fp = fopen(“my_file.txt”,”w”);
if(fp != NULL) fputs(str_file,fp);
else printf(“Невозможно открыть файл на запись.\n”);
fclose(fp);
fp = fopen(“my_file.txt”,”r”);
if(fp != NULL)
{ fgets(str_file,sizeof(str_file),fp);
printf(str_file); }
fclose(fp);
return 0; }
48-49. Открытие файла
Режим открытия Назначение
ios::in Открыть файл для чтения
ios::out Открыть файл для записи
ios::ate Начало вывода устанавливается в конец файла
ios::app Открыть файл для добавления в конец
ios::trunc Усечь файл, то есть удалить его содержимое
ios::binary Двоичный режим операций
Режимы открытия файла представляют собой битовые маски, поэтому можно задавать два или более режима, объединяя их побитовой операцией ИЛИ. В следующем фрагменте кода файл открывается для вывода с помощью функции open():
ofstream ofs;
ofs.open("FileName.dat");
Обратим внимание, что по умолчанию режим открытия файла соответствует типу файлового потока. У потока ввода или вывода флаг режима всегда установлен неявно. Например, для потока вывода в режиме добавления файла можно вместо оператора
ofstream ofs("FName.txt", ios::out | ios::app);
написать
ofstream ofs("FName.txt", ios::app);
Между режимами открытия файла ios::ate и ios::app имеется небольшая разница.
Если файл открывается в режиме добавления, весь вывод в файл будет осуществляться в позицию, начинающуюся с текущего конца файла, безотносительно к операциям позиционирования в файле. В режиме открытия ios::ate (от английского "at end") можно изменить позицию вывода в файл и осуществлять запись, начиная с нее. Для потоков вывода режим открытия эквивалентен ios::out | ios::trunc, то есть можно опустить режим усечения файла. Однако для потоков ввода-вывода его нужно указывать явно. Файлы, которые открываются для вывода, создаются, если они еще не существуют.
Функция open( ) создает файлы со значением прав доступа, равным 0666.
Для «тонкого» открытия файлов с разрешением создания файла в случае его отсутствия, с указанием прав доступа для вновь создаваемого файла и т. п., следует вместо функции open(), которая является интерфейсом к соответствующей функции стандартной библиотеки stdio языка С, использовать стандартную функцию Perl sysopen( ), непосредственно обращающуюся к функции open( ) операционной системы и позволяющую программисту самому задать отдельные компоненты режима работы с файлом: чтение, запись, создание, добавление, очистка содержимого и т. д. Вызов этой функции выглядит следующим образом:
sysopen ДЕСКРИПТОР, ИМЯ_ФАЙЛА, РЕЖИМ [, РАЗРЕШЕНИЕ];
Здесь параметр ИМЯ_ФАЙЛА представляет просто имя файла, параметр РЕЖИМ определяет режим открытия файла и представляет собой число, являющееся результатом операции побитового ИЛИ (|) над константами режимов, определенными в модуле Fcntl. Состав доступных констант зависит от операционной системы.
О_RDONLY Только чтение
О_WRONLY Только запись
О_RDWR Чтение и запись
O_CREAT Создание файла, если он не существует
О_EXCL Завершение с ошибкой, если с файл уже существует
О_APPEND Добавление в конец файла
О_TRUNC Очистка содержимого файла
Для работы с файлами в языке С++ имеется набор функций, определенных в библиотеке stdio.h. Перед началом работы с файлом его следует открыть, что достигается с помощью функции fopen(), имеющей следующий синтаксис:
FILE *fopen( const char *filename, const char *mode );
Здесь filename – строка, содержащая путь и имя файла; mode – строка, определяющая режим открытия файла: на чтение или на запись; FILE – специальный тип данных для работы с файлами. Данная функция возвращает значение NULL, если файл не был успешно открыт, иначе – другое значение. Рассмотрим последовательность действий по созданию простого текстового файла на языке C++ и записи в него текстовой информации.
#include
int main()
{ char str_file[]=”Строка для файла”;
FILE* fp = fopen(“my_file.txt”,”w”);
if(fp != NULL)
{ printf(“Идет запись информации в файл…\n”);
for(int i=0;i < strlen(str_file);i++)
putc(str_file[i],fp); }
else printf(“Невозможно открыть файл на запись.\n”);
fclose(fp);
return 0; }
В данном примере задается специализированный указатель fp типа FILE, который инициализируется функцией fopen(). Функция fopen() в качестве первого аргумента принимает строку, в которой задан путь и имя файла. Вторым параметром определяется способ обработки файла, в данном случае, значение “w”, которое означает открытие файла на запись с удалением всей прежней информации из него. Если файл открыт успешно, то указатель fp не будет равен NULL и с ним возможна работа. В этом случае с помощью функции putc() выполняется запись символов в файл, на который указывает указатель fp. Перед завершением программы открытый файл следует закрыть во избежание в нем потери данных. Это достигается функцией fclose(), которая принимает указатель на файл и возвращает значение 0 при успешном закрытии файла, иначе значение EOF.