Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
s__ekzamen.docx
Скачиваний:
7
Добавлен:
18.12.2018
Размер:
113.34 Кб
Скачать

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.

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