Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Sb97809

.pdf
Скачиваний:
2
Добавлен:
13.02.2021
Размер:
441.54 Кб
Скачать

клавиши Enter в поток записывается два символа: Переход на новую строку и Возврат в начало текущей строки.

Двоичный поток – это последовательность байтов, где имеется однозначное соответствие тому, что находится на внешнем устройстве.

Поток связывается с файлом при помощи операции открытия файла. Файлы на диске, принтере, мониторе, имеют различную структуру. Потоки одинаковы.

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

Если поток открыт для вывода, при выполнении операции закрытия соответствующий буфер записывается на внешнее устройство.

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

Каждый поток, связанный с файлом, имеет управляющую структуру типа FILE, определенную в заголовочном файле сstdio. В нем определены основные характеристики файла (имя, дата создания, статус и т. д.).

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

FILE * fptr;

15.2. Открытие файла

Открытие файла осуществляется с помощью функции fopen.

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

Пример:

FILE * fopen (char * filename, char * mode);

имя файла: мода Мода определяет, в каком режиме вы работаете с файлом. Возможные значения моды:

r – файл открыт на чтение;

rb – двоичный поток;

rt – текстовый поток;

r+ – открыт на чтение записи, файл обязательно должен существовать;

w – открыт на запись;

wb – двоичного файла;

31

wt – текстового файла;

w+ – создать на чтение записи.

Если файл отсутствует, он будет создан и в него будет занесена информация:

w – существующий файл уничтожается, создается новый;

r – файл должен существовать;

wr – существующий файл не уничтожается, если не было – создается заново.

Если файл существует, информация будет добавлена, в случае a, ab, at.

a – открытие на добавление;

ab – двоичная информация;

at – текстовая информация;

a+ – открывается на добавление и создается на чтение записи.

Пример:

#include <stdio.h>

:

:

FILE * fp;

if ((fp=fopen(“test.txt”, “w”)) = =NULL) { puts (“ Не могу открыть файл \n”); exit (1);

}

Поиск файла или его создание осуществляется в рабочем каталоге, где находится исполняемый модуль. В случае, если файл находится в другом каталоге, нужно указывать полный путь, например “H:\BC\\test.txt”.

Функция exit определена в библиотеке сstdlib. Она прекращает выполнение программы и возвращает указанное в скобках значение в операционную систему. Перед окончанием выполнения программы функция закрывает все открытые файлы, освобождает все буферы, выводя все открытые сообщения на экран.

15.3. Запись символов в поток

Запись символов в поток осуществляется при помощи функции putc, имеющей следующий прототип:

int putc (int ch, FILE * fptr);

Если операция прошла успешно, возвращается записанный символ. В случае ошибки возвращается EOF.

32

Считывание символа из потока осуществляется при помощи функции getc, имеющей следующий прототип:

int getc (FILE * fptr);

Функция возвращает EOF, если достигнут конец текста или произошла ошибка. Если считывание произошло успешно, возвращается символ.

Для определения конца файла используется функция feof, имеющая прототип:

int feof (FILE * fptr);

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

while (! feof (fptr)) {ch=getc (fptr) ;}

15.4. Закрытие файла

Закрытие файла осуществляется при помощи функции fclose, имеющей следующий прототип:

int fclose (FILE * fptr);

Функция возвращает “0”, если операция прошла успешно. Данные из буфера считываются в файл, происходит освобождение блока управления файлом, ассоциированного с потоком. Файл становится доступен.

Пример:

#include <stdio.h> main()

{

FILE * in; int ch;

if ((in = fopen (“test.txt”, “r”)) ! = NULL)

{

while ((ch=getc (in)! = EOF) putchar (ch);

fclose(in);

}

else

printf ( “Ошибка открытия файла test.txt\n”);

}

33

Функции fopen и fclose работают с буферизацией, т. е. вводимые и выводимые данные запоминаются во временной области памяти, называемой буфером. При заполнении содержимое буфера передается в блок и т. д. Функция fclose освобождает буфер.

Существует ограничение на количество файлов, которые можно держать открытыми одновременно. Настройка зависит от типа операционной системы. Можно использовать один и тот же указатель на структуру типа FILE для открытия различных файлов, если это делается последовательно.

15.5. Форматный ввод–вывод файлов

Форматный ввод-вывод осуществляется при помощи функций fscanf, fprintf, имеющих следующие прототипы:

int fscanf (FILE * fptr, const char * str); int fprintf (FILE * fptr, const char * str);

Управляющая строка (спецификаторы формата Список аргументов) идентичны функциям printf и scanf.

Пример:

# include <stdio.h> main ()

{

FILE * fi; int age;

fi = fopen (“sam.txt”,”r”); fscanf (fi, “%d”, & age); fclose (fi);

fi = fopen (“data.txt”, “a”); fprintf (fi,”sam is %d\n”, age); fclose (fi);

}

15.6. Ввод–вывод строк

Ввод–вывод строк в файл осуществляется при помощи функций fgets(), fputs ().

Пример:

#define MAXLIN

#include <stdio.h>

34

main ()

{

FILE * fi;

char string [MAXLIN];

fi = fopen (“story.txt”, “r”);

while (fgets (string, MAXLIN, fi) != NULL) puts (string);

}

Первый аргумент функции fgets указывает на строку, куда будет производится считывание. Функция прекращает работу после считывания символа новой строки (нажатие клавиши Enter) или после достижения MAXLIN1.

Подобно функции puts, функция fputs не добавляет символ новой строки при выводе в файл:

fputs (“Вы правы”, fi);

Если функция gets заменяет символ новой строки на признак окончания строки (‘\0’), то fgets сохраняет символ новой строки (‘\n’). Функция fgets возвращает NULL при EOF (достижение конца файла).

15.7. Функции позиционирования

Чтение и запись файла не обязательно осуществлять последовательно. Функция rewind устанавливает индикатор позиции файла на начало файла:

void rewind (FILE * fptr);

Для перемещения указателя в требуемую позицию используется функ-

ция fseek:

int fseek (FILE * fptr, long num, int orign);

В ней long num – количество байт от точки отсчета для установки текущей позиции указателя; int orign – макрос, определяющий точку отсчета и принимающий следующие значения:

SEEK SET или 0 – отсчет от начала файла;

SEEK CUR или 1 – отсчет от текущей позиции курсора;

SEEK END или 2 – отсчет от конца файла.

Функция возвращает 0, если перемещение указателя прошло успешно, 1 – если произошла ошибка. Выход за границу файла не контролируется.

Уничтожение файла

int remove.(char *filename);

Возвращает 0 – при успехе, < >0 – ошибка

35

Функция определения ошибок: int ferror(FILE *fptr);

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

15.8. Функции управления экраном

Для управления диалога пользователя с программой C++ разработана разная система функций управления работой экрана.

Существует два режима работы:

текстовый (text mode), использующий заголовочный файл сconio;

графический (grafics mode), использующий заголовочный файл

сgraphics.

И в текстовом, и графическом режимах функции работают с окном, а не

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

Для задания размера и местоположения окна в текстовом режиме используется функция:

void window (int left, int top, int right, int botton);

В функции left, top, right,botton х, у координаты левого верхнего и правого нижнего угла. Координаты – абсолютные, окна могут перекрываться. Начальные координаты левого верхнего угла в текстовом режиме принимают значение (1;1). Окон может быть несколько, но активным будет только одно окно, с которым в настоящий момент работает ваша программа.

По умолчанию окно соответствует экрану.

16. ЛОКАЛЬНЫЕ КЛАССЫ

Класс может быть объявлен внутри функции. Такой класс называется ло-кальным классом (local class). Функция, в которой объявлен локальный класс, не имеет специального доступа к элементам локального класса. В локальном классе не может быть статических элементов. Область действия локального класса – это функция. Объект локального класса может быть создан только внутри функции. Все функции-члены локального класса должны быть объявлены внутри объявления класса, т. е. должны быть подставляемыми (inline) функциями.

36

Пример:

#include<iostream.h> void f(void);

main()

{

f();

}

void f(void) {class sl{ int x;

public: sl(int a) {x=a;}

void qv(void) {x=x*x;

cout<<”квадрат числа”<<x; }};

sl obj1(5),obj2(10); obj1.qv(); obj2.qv();

}

16.1. Вложенные классы

При объявлении класса внутри его шаблона может быть объявлен другой класс. Такой класс называется вложенным (nested). Вложенный класс находится в области действия объемлющего класса. Объекты вложенного класса могут использоваться как элементы объемлющего класса или в функ- циях-членах объемлющего класса. Функции-члены вложенного класса могут быть описаны в глобальной области действия, если объемлющий класс также описан в глобальной области.

Пример:

#include<iostream.h> class CL{

class nested{ int who; public:

nested(int a):

37

~nested(void);

};

public: CL(int b)

{nested obj(b*b); cout<<”Конструктор класса CL|n”;

}

~CL(void)

{cout<<”Деструктор класса CL|n”;

}

}; CL::nested::nested(int a)

{who=a;

cout<<”Конструктор вложенного класса<<who”;

}

CL::nested::~nested(void)

{cout<<”Деструктор вложенного класса<<who”;

}

main()

{

CL cl_obj(3); return 0;

}

17. ФУНКЦИИ УПРАВЛЕНИЯ ЭКРАНОМ

Для управления диалога пользователя с программой в C++ разработана развитая система функций управления работы с экраном.

Пакет функций управления экраном делится на две части в соответствии

свозможностями компьютера:

текстовый режим (text mode), определенный в библиотеке conio.h;

графический режим (grafics mode), определенный в библиотеке graphics.h.

И в текстовом и в графическом режиме функции работают с окном, а не

сэкраном.

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

38

17.1. Функции работы в текстовом режиме

Для текстового экрана левый верхний угол окна имеет координаты (1;1). Функция задания размера и местоположения окна:

void window (int left, int top, int right, int botton);

Координаты left, top, right, botton являются абсолютными, т. е. рассматриваются относительно всего экрана. Поэтому вновь создаваемые окна могут перекрываться друг другом. Координаты left, top являются координатами левого верхнего угла, right, botton – правого нижнего. Если координаты заданы неверно, то никакого действия не происходит.

Окон может быть несколько, но активным будет только одно окно, с которым в настоящий момент работает ваша программа.

Очистка экрана: void clrscr(void)

Активное окно очищается, курсор устанавливается в левом верхнем углу окна.

Позиционирование курсора: void gotoxy(int x, int y);

Здесь х, y координаты активного окна. Если координаты выходят за пределы области, то действие не выполняется и ошибка не фиксируется.

Возврат координат x, y текущего положения курсора: int wherex();

int wherey();

Возвращают координаты х и у текущего положения курсора. Очистка строки с текущей позиции курсора до правой границы окна: void clear(void);

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

Уничтожение строки: void delline(void);

Функция уничтожает строку, обозначенную курсором, а все строки, находящиеся под ней, поднимаются вверх.

Вставка пустой строки: void insline(void);

вставляет пустую строку, а та строка, где находился курсор, и те строки, которые находились ниже, спускаются на одну позицию.

Установка видеорежима.

39

Пусть установлен текущий видеорежим компьютера, который почти всегда следующий: 25 строк × 80 символов в строке. Существует несколько текстовых режимов. Установкой или заменой текстового режима управляет функция textmode с прототипом:

void textmode(int mode);

Здесь аргумент mode может быть одной из следующих величин:

0–40 символов

×

25

строк (черно-белый);

1–40 символов

×

25

строк (цветной);

2–80 символов

×

25

строк (черно-белый);

3–80 символов

×

25

строк (цветной);

–1 – предыдущий режим.

Современная техника предполагает возможность выдачи текста в цвете. Можно определить как цвет текста, так и цвет фона.

Функция изменения цвета текста: void textcolor(int color);

BLACK – 0

WHITE – 15

Аргумент color может принимать значения от 0 до 15. Каждое значение соответствует своему цвету. Кроме того, в файле conio.h определены макросы, соответствующие этим цветам. Например, BLACK – 0. Можно сделать цвет мигающим, например RED/BLINK. Изменение цвета текста оказывает действие только на вновь выводимый текст. Текст, уже находящийся на экране, своего параметра не меняет.

Установка цвета фона под вновь выводимым текстом : void textbackground(int color);

Величина color может принимать значения 0…6.

Функция сlrscr() не только очищает активное окно, но и заполняет его цветом, заданным в функции textbackground.

Сохранение, восстановление и перемещение части экрана. В библио-

теке предусмотрены функции, позволяющие сохранять, восстанавливать и перемещать содержимое части экрана. Этими функциями являются соответственно:

int gettext(int left, int top,int right,int bootom,void *design); int put text(int left, int top,int right,int bootom, void *source);

int movetext(int left, int top, int right, int bottom, int destleft, int desttop);

40

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