Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тельнов по билетам.docx
Скачиваний:
5
Добавлен:
07.04.2023
Размер:
3.61 Mб
Скачать

Вывод в файл

int putc(int с, FILE *stream);

Функция выводит символ с в поток stream и возвращает выведенный символ как результат работы. При достижении конца файла или возникновении ошибки в/в возвращает EOF.

int fputs(char *s, FILE *stream);

Функция выводит строку s в поток stream. В случае успеха функция возвращает некоторое неотрицательное число (обычно количество выведенных символов). Значение EOF возвращается, если произошла ошибка в/в.

int fprintf(FILE *stream, <список-форматов> [, <список-данных>]);

Функция осуществляет форматный вывод данных в поток stream, в соответствии с заданным <списком-данных>, преобразуя данные в соответствии с заданным <списком-форматов>. В случае успеха функция возвращает количество введенных байтов. При возникновении ошибки в/в функция возвращает некоторое отрицательное значение.

Особые ситуации

int feof(FILE *stream);

Функция возвращает некоторое ненулевое значение (истину), если при последней попытке чтения из потока stream был достигнут конец файла. Нулевое значение (ложь) возвращается, если конец файла не был достигнут.

int ferror(FILE *stream);

Функция возвращает некоторое ненулевое значение (истину), если при работе с потоком stream произошла ошибка в/в. Нулевое значение (ложь) возвращается, если ошибок в/в при работе с потоком stream зафиксировано не было. Индикатор ошибки в/в сбрасывается после закрытия файла, связанного с данным потоком или после вызова специальной функции clearerr.

int ungetc(int с, FILE *stream);

Функция «заталкивает» символ с в поток stream, открытый для чтения. Последующая операция чтения из потока stream выдаст символ с. В случае успеха функция возвращает символ с. При возникновении ошибки в/в поток stream не изменяется и функция возвращает значение EOF.

Пример: слияние файлов

Имена дисковых файлов заданы в командной строке.

Файлы последовательно открываются и их содержимое копируется в стандартный вывод.

а.ехе <имя-файла-1> <имя-файла-2> … <имя-файла-n>

#include <stdio.h>

void filecopy(FILE *stream) { // копирование одного файла

int с;

while ((с = getc(stream)) != EOF) putc(с, stdout);

}

void main(int argc, char *argv[]) {

FILE *stream;

if (argc == 1) filecopy(stdin); // если файлы не заданы, то stdin >> stdout

else while (--argc) // пока не исчерпан список файлов

if ((stream = fopen(*++argv, “r”)) == NULL) // пытаемся открывать

{ fprintf(stderr, “ореn еrr: %s\n”, *argv); break; } // не открывается

else { filecopy(stream); fclose(stream); } // копируем и закрываем }

2)Объекты классов. Статические, автоматические, динамические. Примеры.

Пусть имеется такое описание:

class Х { // описан класс Х ( это похоже на описание структуры)

public: // доступ извне к элементам класса разрешен

chat *data; // элемент данных класса Х

void f(void); // функция-член класса Х

};

Х а; // описан а - объект класса Х

static X v[10]; // описан v - статический массив объектов класса Х

Х *рх =new Х; // описан рх - указатель на объект класса Х

Доступ извне описания класса к элементам данных и членам класса

осуществляется (если он разрешён) с помощью уточненных имен:

Х::data - уточненное имя элемента данных data класса Х

Х::f() — - уточненное имя функции-члена f() класса Х

Если имеется объект а класса Х и указатель рх на объект класса Х, тогда

доступ извне класса осуществляется (если он разрешён) следующим образом:

а.data или рх->data - доступ к элементу данных извне класса

а.f() или рх->f() - вызов функции-члена извне класса

Доступ изнутри класса к элементам данных и функциям-членам класса

возможен по их простым именам. Кроме того, у любой функции-члена класса

всегда имеется неявный аргумент с именем this.

Неявный аргумент this есть указатель на тот объект класса, для которого эта

функция-член вызывается.

Например, пусть имеется объект а класса Х.

Тогда this <-> &а, и внутри любой функции-члена класса возможны следующие

корректные обращения:

this -> data - доступ к элементу данных из функции-члена класса

this -> f() - вызов функции-члена из другой функции-члена класса

Пример 1. Статические данные и методы классов

class S{

static int a; // статический элемент данных класса

public:

static void h(S* ){} // статический метод класса

};

void main(void) {

S obj , &objref=obj,*pobj=&obj,v[9]; // объект, ссылка, указатель, массив

h (&obj); // это ошибка!

obj.h(pobj); // это правильно

pobj->h(&obj); // это тоже правильно

}