МЕНЮ


Фестивали и конкурсы
Семинары
Издания
О МОДНТ
Приглашения
Поздравляем

НАУЧНЫЕ РАБОТЫ


  • Инновационный менеджмент
  • Инвестиции
  • ИГП
  • Земельное право
  • Журналистика
  • Жилищное право
  • Радиоэлектроника
  • Психология
  • Программирование и комп-ры
  • Предпринимательство
  • Право
  • Политология
  • Полиграфия
  • Педагогика
  • Оккультизм и уфология
  • Начертательная геометрия
  • Бухучет управленчучет
  • Биология
  • Бизнес-план
  • Безопасность жизнедеятельности
  • Банковское дело
  • АХД экпред финансы предприятий
  • Аудит
  • Ветеринария
  • Валютные отношения
  • Бухгалтерский учет и аудит
  • Ботаника и сельское хозяйство
  • Биржевое дело
  • Банковское дело
  • Астрономия
  • Архитектура
  • Арбитражный процесс
  • Безопасность жизнедеятельности
  • Административное право
  • Авиация и космонавтика
  • Кулинария
  • Наука и техника
  • Криминология
  • Криминалистика
  • Косметология
  • Коммуникации и связь
  • Кибернетика
  • Исторические личности
  • Информатика
  • Инвестиции
  • по Зоология
  • Журналистика
  • Карта сайта
  • Лекции по C++

    Пример 10:

    class String

    {

    protected:

    char *str;

    int num;

    public:

    String();

    ~String();

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

    // операция присваивания

    String& operator =(String& s);

    String& operator +=(String& s);

    // операции конкатенации

    friend String& operator +(String& s1, String& s2);

    friend String& operator +(const char* s1, String& s2);

    friend String& operator +(String& s1, const char* s2);

    // операции отношения

    friend int operator >(String& s1, String& s2);

    friend int operator =>(String& s1, String& s2);

    friend int operator

    class X

    {

    public:

    double A(double x) { return x * x; }

    double B(double x) { return A(x) / 2; }

    };

    class Y : public X

    {

    public:

    double A(double x) { return x * x * x; }

    };

    int main ()

    {

    Y y;

    cout );

    };

    class className2 : public className1

    {

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

    virtual returnType functionName();

    };

    Пример 7, показывающий, как при помощи виртуальных функций можно

    реализовать полиморфное поведение классов X и Y:

    #include

    class X

    {

    public:

    virtual double A(double x) { return x * x; }

    double B (double x) { return A(x) / 2; }

    };

    class Y : public X

    {

    public:

    virtual double A(double x) { return x * x * x; }

    };

    main()

    {

    Y y;

    cout

    class A

    {

    public:

    A() {}

    virtual void foo(char c)

    { cout );

    };

    Пример 9:

    class String

    {

    protected:

    char *str;

    int len;

    public:

    String();

    ~String();

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

    friend String& append(String &str1, String &str2);

    friend String& append(const char* str1, String &str2);

    friend String& append(String &str1, const char* str2);

    };

    Дружественные функции могут решать задачи, которые при помощи

    функций-элементов решаются с трудом, неуклюже или не могут быть решены

    вообще.

    Рассмотрим простой пример использования дружественных функций.

    Текст программы FRIEND.CPP представлен в листинге 8.5. Программа следит за

    памятью, отведенной для хранения массива символов. Эта программа - первый

    шаг к созданию класса string.

    Операции и дружественные операции

    Последняя программа использовала функции-элементы и дружественную

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

    помощью операций вроде = и +. Подход типичен для языков C и Pascal, потому

    что эти языки не поддерживают определяемые пользователем операции. В

    отличии от них C++ позволяет вам объявлять операции и дружественные

    операции. Эти операции включают в себя: +, -, *, /, %, ==, !=, =,

    >, +=, -=, *=, /=, %=, [], (), >. Обратитесь к описанию языка C++,

    где обсуждаются детали определения этих операций. С++ трактует операции и

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

    дружественных функций.

    Общий синтаксис для объявления операций и дружественных операций:

    class className

    {

    public:

    // конструкторы и деструктор

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

    // унарная операция

    returnType operator operatorSymbol();

    // бинарная операция

    returnType operator operatorSymbol(operand);

    // унарная дружественная операция

    friend returnType operator operatorSymbol(operand);

    // бинарная дружественная операция

    friend returnType operator operatorSymbol(firstOperand, secondOperand);

    };

    Пример 10:

    class String

    {

    protected:

    char *str;

    int num;

    public:

    String();

    ~String();

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

    // операция присваивания

    String& operator =(String& s);

    String& operator +=(String& s);

    // операции конкатенации

    friend String& operator +(String& s1, String& s2);

    friend String& operator +(const char* s1, String& s2);

    friend String& operator +(String& s1, const char* s2);

    // операции отношения

    friend int operator >(String& s1, String& s2);

    friend int operator =>(String& s1, String& s2);

    friend int operator , если вы ссылаетесь

    на них при помощи указателей.

    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

    Прототип функции 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 закрывает поток и освобождает использовавшиеся ресурсы.

    Эти ресурсы включают буфер памяти для операции потокового ввода/вывода.

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

    Прототип для функции close:

    void close();

    Пример 2.

    fstream f;

    // открыть поток

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

    // работа с файлом

    // закрыть поток

    f.close ();

    Stream-библиотека C++ включает в себя набор основных функций, которые

    контролируют состояние ошибки потоковой операции. Эти функции включают

    следующие:

    1. Функция good() возвращает ненулевое значение, если при выполнении

    потоковой операции не возникает ошибки. Объявление функции good: int

    good();

    2. Функция fail() возвращает ненулевое значение, если при выполнении

    потоковой операции возникает ошибка. Объявление функции fail: int fail();

    3. Перегруженная операция ! применяется к экземпляру потока для определения

    состояния ошибки.

    Stream-библиотека C++ предоставляет дополнительные функции для

    установки и опроса других аспектов и типов ошибок потока.

    ПОСЛЕДОВАТЕЛЬНЫЙ ТЕКСТОВЫЙ ПОТОК ВВОДА/ВЫВОДА

    Функции и операции последовательного текстового ввода/вывода являются

    довольно простыми. Вы уже имели дело со многими из них в предыдущих уроках.

    Эти функции и операции включают:

    - Операция извлечения из потока > читает символы потока.

    - Функция getline читает строку из потока.

    Функция-элемент getline

    Прототипы функции-элемента getline:

    istream& getline (char* buffer, int size, char delimiter = '\n');

    istream& getline (signed char* buffer, int size, char delimiter = '\n');

    istream& getline (unsigned char* buffer, int size, char delimiter = '\n');

    Параметр buffer - это указатель на строку, принимающую символы из

    потока. Параметр size задает максимальное число символов для чтения.

    Параметр delimiter указывает разделяющий символ, который вызывает

    прекращение ввода строки до того, как будет введено количество символов,

    указанное в параметре size. По умолчанию параметру delimiter присваивается

    значение '\n'.

    Пример 3.

    fstream f;

    char textLine[MAX];

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

    while (!f.eof()) {

    f.getline(textLine, MAX);

    cout пробелы.

    - Записывает эти строки в выходной файл и также в стандартное окно

    вывода.

    Листинг 10.1. Исходный код программы TRIM.CPP

    // C++ программа демонстрации последовательного файлового

    // ввода/вывода

    Программа в листинге 10.1 не объявляет никаких классов, вместо этого

    она фокусируется на использовании файловых потоков для ввода и вывода

    текста. Эта программа описывает функции trimStr, getInputFilename,

    getOutputFilename, processLines и обязательную функцию main.

    Функция trimStr вычищает пробелы в строках, передаваемых

    через параметр s. Эта функция объявляет переменную i и присваивает ей

    индекс символа, находящегося сразу за завершающим нулем. Функция использует

    цикл while, начинающийся в строке 14, чтобы выполнить обратное сканирование

    символов в строке s до первого символа, не являющегося пробелом. Оператор в

    строке 16 присваивает завершающий нуль символу, стоящему справа от

    последнего символа, не являющегося пробелом, в строке s.

    Функция getInputFilename получает имя входного файла и открывает

    соответствующий файловый поток. Параметр inFile передает это имя вызывающей

    функции. Ссылочный параметр f передает открытый входной поток вызывающей

    функции. Функция getInputFilename объявляет локальный флажок ok и

    использует цикл do-while (строки с 23 по 34), чтобы открыть входной файл.

    Строка 25 содержит первый оператор тела цикла, в котором флажок ok

    инициализируется значением true. Оператор вывода в строке 26 запрашивает

    ввод имени входного файла; в строке 27 с помощью вызова функции getline это

    имя принимается и сохраняется в переменной inFile. Оператор в строке 28

    пытается открыть входной файл, используя параметр потока f. Оператор open

    использует значение ios::in для указания на то, что входной текстовый файл

    был открыт. Если вызов возвращает ошибку, оператор if (строка 29) определит

    это, сообщит об ошибке открытия файла пользователю и присвоит переменной ok

    значение false. При значении ok, равном true, цикл do-while будет

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

    успешное открытие файла.

    Функция getOutputFilename подобна функции getInputFilename в попытках

    получить имя файла от пользователя и открыть файл. Однако в этом случае

    файл открывается на запись и его имя сравнивается с именем входного файла.

    В строке 47 проверяется совпадение имен входного и выходного файлов, и,

    если пользователь ввел одно и то же имя, ему предлагается снова ввести имя

    выходного файла.

    Функция processLines читает строки их входного файлового потока,

    приводя их в порядок и записывая в выходной файловый поток. Параметры fin и

    font передают файловые указатели входного и выходного потоков,

    соответственно. Эта функция объявляет локальную строковую переменную line и

    использует (строки с 69 по 74) цикл while для обработки текстовых строк.

    Предложение while содержит вызов функции getline, которая читает следующую

    строку входного потока fin и присваивает переменной line содержимое этой

    строки. В теле этого цикла просто вызывается функция trimStr, а затем line

    передается в потоки fout и cout. Заметьте, что команды для получения строки

    текста из файла и передачи ее в файл в точности совпадают с теми, которые

    могли бы использоваться для получения текста с экрана и передачи его на

    экран. Это происходит потому, что используемые вами cout и cin - на самом

    деле только потоки, которые открываются автоматически и работают

    непосредственно с

    экраном.

    Функция main, как обычно со всеми уже описанными функциями, довольно

    простая. Она только объявляет переменные файловых потоков fin, fout и

    inFile, outFile для сохранения имен этих потоков. Далее входной и выходной

    файлы открываются в функциях getInputFilename и getOutputFilename. Наконец,

    функция processLine приводит в порядок и копирует содержимое файла, а

    функция-компонент close вызывается для каждого из потоков.

    ПОСЛЕДОВАТЕЛЬНЫЙ ДВОИЧНЫЙ ФАЙЛОВЫЙ ВВОД/ВЫВОД

    Stream-библиотека C++ имеет перегруженные потоковые функции-элементы

    write и read для последовательного двоичного файлового ввода/вывода.

    Функция write посылает ряд байт в выходной поток. Эта функция может

    записывать любую переменную или экземпляр в поток.

    Функция-элемент write

    Прототип перегруженной функции-элемента:

    ostream& write(const char* buff, int num);

    ostream& write(const signed char* buff, int num);

    ostream& write(const unsigned char* buff, int num);

    Параметр buff - это указатель на буфер, содержащий данные, которые

    будут посылаться в выходной поток. Параметр num указывает число байт в

    буфере, которые передаются в этот поток.

    Пример 4.

    const MAX = 80;

    char buff[MAX+1] = "Hello World!";

    int len = strlen (buff) + 1;

    fstream f;

    f.open("CALC.DAT", ios::out | ios::binary);

    Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11


    Приглашения

    09.12.2013 - 16.12.2013

    Международный конкурс хореографического искусства в рамках Международного фестиваля искусств «РОЖДЕСТВЕНСКАЯ АНДОРРА»

    09.12.2013 - 16.12.2013

    Международный конкурс хорового искусства в АНДОРРЕ «РОЖДЕСТВЕНСКАЯ АНДОРРА»




    Copyright © 2012 г.
    При использовании материалов - ссылка на сайт обязательна.