double arrow

Функция-компонент open

Контрольные вопросы

ВОПРОСЫ И ОТВЕТЫ

Что случится, если я объявлю конструктор по умолчанию, конструктор копии и другие конструкторы в защищенной области?

Программы, использующие ваш класс, не смогут создавать объекты этого класса. Однако они смогут объявлять классы-потомки с открытыми конструкторами.

Могу я задать цепочку вызовов функций-элементов ?

Да, можете, только если указанные в цепочке функции-элементы возвращают ссылку на тот же самый класс. Например, если в классе String объявлены следующие функции-элементы:

String& upperCase();

String& reverse();

Stringa mapChar(char find, char replace);

вы можете написать следующий оператор обработки объекта класса

String:

s.upperCase().reverse().mapChar(' ', '+');

Что может случиться, если класс полагается на конструктор копии, созданный компилятором, и при этом класс использует указатели в качестве элементов-данных?

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

Могу ли я создавать массив объектов?

Да, можете. Однако соответствующий класс должен иметь заданный по умолчанию конструктор. При создании массива используется ранее упомянутый конструктор.

Могу ли я использовать указатель при создании объекта класса?

Да, можете, но в этом случае вы должны использовать операции new и delete, чтобы распределять и освобождать память для данного объекта.

Вот пример, использующий класс Complex. Не забудьте, что для обращения к элементам классов или структур используется операция ->, если вы ссылаетесь на них при помощи указателей.

Complex *pC;

pC = new Complex;

// операции с объектом, к которому обращаются по указателю pC

delete pC;

или

Complex *pC = new Complex;

// операции с объектом, к которому обращаются по указателю pC

delete pC;

1. Найдите ошибку в следующем объявлении класса:

class String {

char *str;

unsigned len;

String ();

String(const String& s);

String(unsigned size, char = ' ');

String(unsigned size);

String& assign(String& s);

~String();

unsigned getLen() const;

char* getString();

// другие функции-элементы

};

2. Найдите ошибку в следующем объявлении класса:

class String {

protected:

char *str;

unsigned len;

public:

String();

String(const char* s);

String(const String& s);

String(unsigned size, char = ' ');

String(unsigned size);

~String();

// другие функции-элементы

3. Верно или нет? Следующий оператор, который создает объект s класса String, объявленного ранее, является правильным:

s = String("Hello Borland C++");

4. Если в программе OPERATOR.CPP вы следующим образом измените объявления объектов, будет ли программа компилироваться без ошибок?

String s1 = String("Kevin");

String s2 = String(" Нау");

String s3 = s1;

ФАЙЛОВЫЕ ОПЕРАЦИИ ВВОДА/ВЫВОДА

Сегодняшний урок посвящен файловым операциям ввода/вывода с использованием библиотеки управления потоками C++. У вас есть две возможности: либо использовать функции файлового ввода/вывода, описанные в заголовочном файле STDIO.H, либо функции stream-библиотеки C++. Каждая из этих библиотек имеет множество мощных и удобных функций. Сегодня будут представлены основные операторы, которые позволят вам читать и записывать данные в файл. Вы изучите следующие темы:

Стандартные функции потоков ввода/вывода

- Последовательный ввод/вывод потока с текстовой информацией

- Последовательный ввод/вывод двоичных данных

- Прямой доступ к потоку двоичных данных

Stream-библиотека C++

Stream-библиотека (известная также как библиотека iostream) выполнена в виде иерархии классов, которые описаны в нескольких заголовочных файлах. Файл IOSTREAM.H, используемый до сих пор, - это только один из них. Другой, который будет интересен в этой главе, - FSTREAM.H. Файл IOSTREAM.H поддерживает основные классы для ввода/вывода потока. Файл FSTREAM.H содержит определения для основных классов файлового ввода/вывода.

Существуют дополнительные файлы библиотеки ввода/вывода, в которых имеются более специализированные функции ввода/вывода.

ОБЩИЕ ФУНКЦИИ ПОТОКОВОГО ВВОДА/ВЫВОДА

В этом разделе представлены функции-элементы ввода/вывода, являющиеся общими как для последовательного, так и для прямого доступа. Эти функции включают open, close, good и fail в дополнение к операции !. Функция open открывает файловый поток для ввода, вывода, добавления, а также для ввода и вывода. Эта функция позволяет указывать тип данных, с которыми вы собираетесь работать: двоичные или текстовые.

При работе с файловым вводом/выводом очень важно знать различие между текстовым и двоичным режимами. Текстовый режим предназначен для текстовых файлов, в которых имеются строки обычного текста. Двоичный режим используется для любых других и особенно для файлов, которые сохраняются в форматах, неудобных для чтения человеком.

Существуют некоторые особые тонкости, связанные с файлами текстового режима, на которые следует обратить особое внимание и запомнить. Первая из них - символ EOF (26 в коде ASCII или Ctrl+Z) - представляет собой метку (символ) конца файла. В текстовом режиме, где встречается символ EOF, система C++ низкого уровня автоматически продвигается к концу файла; вы ничего не можете прочитать после специального символа. Это может вызвать проблемы, если такой специальный символ окажется в середине файла.

Другая особенность текстового режима заключается в том, как интерпретируются строки текстового файла. Каждая строка заканчивается последовательностью конца строки (EOL). На компьютерах PC и совместимых с ними EOL-последовательность представлена двумя символами кода ASCII: CR (13 в коде ASCII или Ctrl+M) и LF (10 в коде ASCII или Ctrl+J). Эта CRLF-последовательность используется функциями чтения и записи текстовой строки, которые автоматически, вставляют ее в файл или удаляют из него. Заметьте, что на большинстве других, систем (UNIX и Macintosh) EOF просто является символом LF.

Прототип функции open

void open (const char* filename, int mode, int m = filebuf::openprot);

Параметр filename задает имя открываемого файла. Параметр mode указывает режим ввода/вывода. Далее следует список аргументов для mode, описанных в заголовочном файле FSTREAM.H:

- in открыть поток для ввода,

- out открыть поток для вывода,

- ate установить указатель потока на конец файла,

- app открыть поток для добавления,

- trunk удалить содержимое файла, если он уже существует (bc++5),

- nocreate инициировать ошибку, если уже не существует,

- noreplace инициировать ошибку, если файл уже существует,

- binary открыть в двоичном режиме.

Пример 1.

// открыть поток для ввода

fstream f;

f.open("simple.txt", ios::in);

// открыть поток для вывода fstream f;

fstream f;

f.open ("simple.txt", ios::out);

// открыть поток ввода/вывода для двоичных данных fstream f;

fstream f;

f.open("simple.txt", ios::in | ios::out | ios::binary);

Внимание: Классы файловых потоков предусматривают конструкторы, которые выполняют действия (и имеют такие же параметры) функции-компонента open.

Функция close закрывает поток и освобождает использовавшиеся ресурсы. Эти ресурсы включают буфер памяти для операции потокового ввода/вывода.


Сейчас читают про: