Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posobie_Cpp.doc
Скачиваний:
6
Добавлен:
20.11.2019
Размер:
603.14 Кб
Скачать

6.2 Тонкости работы с файлами

Открывая файл на чтение, мы подразумеваем, что файл реально существует и находится в текущей папке с проектом (если мы запускаем программу из Visual Studio) или в папке с exe-файлом программы (если программа запускается вне Visual Studio).

  • Помните – в имя файла можно включать и путь к нему, если это, конечно, нужно. Например: “c:\tmp|test.txt”

А что произойдет, если файл по указанному пути не найден? В приведенных выше примерах, объявленные на чтение файлы будут созданы пустыми, а значения переменных, которые из него считываются – неопределенными. В результате при выполнении программы возникнет ошибка. Поможет предотвратить эту ситуацию использование функции is_open(). Функция возвращает значение TRUE, если файл был корректно открыт и FALSE в противном случае1. Вот как можно улучшить код чтения из файла, добавив проверку:

fstream fin("test.txt",ios::in);

if(!fin.is_open()) // если файл не открыт…

{

cout<<”Ошибка открытия файла”<<endl;

return; // окончание работы программы

}

Пока мы ограничивались случаями только чтения (in) или только записи (out) из/в файлы. А как быть в других случаях, например, добавления данных в конец файла? В таблице 6.1 приведены константы режимов работы с файлом.

Таблица 6.1. Константы режимов работы с файлами.

Константа

Значение

ios::in

Открыть файл для чтения

ios::out

Открыть файл для записи

ios::ate

Переместить указатель в конец файла

ios::app

Добавлять информацию к концу файла

ios::trunc

Содержимое существующего файла удаляется

ios::binary

Двоичный файл

Комбинация режимов чтения/записи создается при помощи оператора | (или):

ios::in|ios::out

Открыть файл для чтения и записи

ios::out|ios::app

Открыть файл для записи, но только для добавления

Очевидно, есть множество комбинаций режимов. Некоторые комбинации недопустимы: ios::in|ios::trunc - нельзя открыть файл для чтения, удалив его содержимое.

7. Классы в C++.

7.1. Определение классов.

Одним из основных отличий C++ от С является концепция классов. Классы похожи на структуры, но структура описывает только данные, связанные с ней, или свойства. Например:

#include <iostream.h>

// объявление структуры:

struct circle { int radius; int color; };

Void main()

{

circle MyCircle; // переменная типа circle MyCircle.radius = 18; // свойство окружности ‑ радиус MyCircle.color = 255; // свойство цвет cout<< MyCircle.radius<< MyCircle.color;

}

Класс в C++ имеет как ассоциированные с ним свойства, так и функции (методы), которые выполняют некоторые действия. Например, вывода окружности на экран. Следовательно, в программе, которая использует объект MyCircle класса circle, можно написать следующий код:

MyCircle.radius = 20; MyCircle.color = 255; MyCircle.DisplayCircle() ;

  • Имя класса, согласно общепринятому, но не обязательному правилу, начинается с заглавной буквы.

Первые два оператора присваивают значения свойствам radius и color объекта MyCircle, а третий ‑ вызывает функцию DisplayCircle(). Перед тем как работать с классом, его следует объявить. Вот возможное объявление класса Сircle:

class Circle {

public:

Circle () ; // конструктор

void SetRadius(void) ; // прототипы функций классов (методов)

void GetRadius(void) ;

~Circle () ; // деструктор

private:

void CalculateArea(void); // прототип функции класса (метода) int radius;

int color;

}; // не забывайте про точку с запятой!

Ключевое слово class показывает компилятору, что все находящееся в фигурных скобках принадлежит объявлению класса. Объявление класса содержит объявление элементов данных (например, int radius) и прототипы функций ‑ элементов класса. В объявлении класса Circle содержатся следующие элементы данных:

int radius; int color;

Объявление также содержит пять прототипов функций-элементов:

Circle();

void SetRadius(void) ; void GetRadius(void) ; ~Circle () ; void CalculateArea(void);

Первый и четвертый прототипы выглядят странно. Первый из них является прототипом функции конструктора1:

Circle();

а другой – деструктора:

~Circle ();

Обратите внимание на символ тильды (~), который предшествует прототипу функции деструктора.

Запомните синтаксические правила для конструктора:

  • каждое объявление класса должно включать прототип функции конструктора;

  • имя функции конструктора должно совпадать с именем класса, а после него должны следовать круглые скобки;

  • не упоминайте никакого возвращаемого значения для функции конструктора (функция конструктора должна иметь тип void, но не нужно это указывать.);

  • функция конструктора должна располагаться под ключевым словом public.

и деструктора:

  • имя функции деструктора должно совпадать с именем класса и ему должен предшествовать символ ~;

  • не указывайте никакого возвращаемого значения для функции деструктора;

  • функция деструктора не имеет никаких параметров;

Прототипы функций и объявления элементов данных включаются в объявлении класса в разделы public (открытый) или private (закрытый). Ключевые слова public и private говорят компилятору о доступности элементов-функций и данных. Например, функция SetRadius() определена в разделе public, и это означает, что любая функция программы может вызвать функцию SetRadius(). Функция CalculateArea() определена в разделе private, и эту функцию можно вызвать только в коде функций-элементов класса Circle.

Аналогично, поскольку элемент данных radius объявлен в разделе private, прямой доступ к нему (для установки или чтения его значения) возможен только в коде функций-элементов класса Circle.

После того, как в программе дано определение класса, можно объявить и другой объект, класса Circle, например, с именем HerCircle. Делается это так:

Circle HerCircle;

Следующие операторы присваивают значения элементам данных HerCircle - radius и color:

HerCircle.radius = 30; HerCircle.color = 0;

HerCircle.DisplayCircle(); // рисование окружности.

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