Скачать презентацию Cпецификаторы класса хранения Cпецификаторы класса хранения модификаторы Скачать презентацию Cпецификаторы класса хранения Cпецификаторы класса хранения модификаторы

prog_lk9_new.pptx

  • Количество слайдов: 108

Cпецификаторы класса хранения Cпецификаторы класса хранения

Cпецификаторы класса хранения (модификаторы хранения) Cпецификаторы класса хранения сообщают компилятору, как хранить следующую за Cпецификаторы класса хранения (модификаторы хранения) Cпецификаторы класса хранения сообщают компилятору, как хранить следующую за ним переменную. • auto; • extern; • static; • register.

Спецификатор auto используется для объявления локальных переменных (локальные переменные являются auto по умолчанию). Спецификатор auto используется для объявления локальных переменных (локальные переменные являются auto по умолчанию).

Спецификатор extern используeтся при объявле нии переменных в многофайловых программах. Т. к. С++ позволяет Спецификатор extern используeтся при объявле нии переменных в многофайловых программах. Т. к. С++ позволяет выполнять раздельную компиляцию модулей для большой программы, существует способ передачи информации о глобальных переменных файлам программы. Все глобальные переменные объявляются в одном файле и используются при объявлении в других файлах слова extern.

Пример Файл 1 int х, у; char ch; Файл 2 extern int x, y; Пример Файл 1 int х, у; char ch; Файл 2 extern int x, y; extern char ch; main(void) {. . . } void func 22(void) { х= у/ 10; } void func 1 (void) { x = 23; } void func 23(void) { y=10; }

Спецификатор extern сообщает компилятору, что следующие за ним типы и имена переменных объявляются где Спецификатор extern сообщает компилятору, что следующие за ним типы и имена переменных объявляются где то в другом месте. Т. о. extern позволяет компилятору знать о типах и именах глобальных переменных без действительного создания этих переменных. Когда два модуля объединяются, все ссылки на внешние переменные пересматриваются.

Спецификатор static • Спецификатор static используется для объявления переменных, которые являются постоянными переменными внутри Спецификатор static • Спецификатор static используется для объявления переменных, которые являются постоянными переменными внутри функции или файла. • Они отличаются от глобальных переменных, поскольку не известны за пределами функции или файла, но могут хранить свои значения между вызовами.

Статические локальные переменные • Когда static применяется к локальной переменной, это приводит к тому, Статические локальные переменные • Когда static применяется к локальной переменной, это приводит к тому, что компилятор создает долговременную область для хранения переменной почти таким же способом, как это делается для глобальной переменной. • Ключевое различие между статической локальной и глобальной переменными заключается в том, что статическая локальная переменная остается известной только в том блоке, в котором она была объявлена. • Статическая локальная переменная это локальная переменная, сохраняющая свое значение между вызовами функций.

Статические глобальные переменные • Когда спецификатор static применяется к глобальной переменной, он сообщает компилятору Статические глобальные переменные • Когда спецификатор static применяется к глобальной переменной, он сообщает компилятору о необходимости создания глобальной переменной, которая будет известна только в файле, где статическая глобальная переменная объявлена. • Это означает, что, даже если переменная является глобальной, другие подпрограммы в других файлах не будут знать о ней.

Статические глобальные переменные • Имена статических локальных переменных известны только функции или блоку кода, Статические глобальные переменные • Имена статических локальных переменных известны только функции или блоку кода, в которых они объявлены, а имена статических глобальных переменных известны только в файле, в котором они находятся. • В сущности модификатор static разрешает использование функциями переменных, не беспокоя другие функции.

Спецификатор register • Спецификатор register применяется только к пе ременным типа nt и char. Спецификатор register • Спецификатор register применяется только к пе ременным типа nt и char. i • Используется для объявле ния переменных, которые хранятся не в ОП, а в регистрах ЦП (для экономии времени). • Подобная экономия делает register переменные идеальными для управления циклом. • Допускается применять к локальным перемен ным и к формальным параметрам в функции, но нельзя использовать для глобальных переменных.

Спецификатор register • Количество регистровых переменных в С++ ограни чено вумя. д • С Спецификатор register • Количество регистровых переменных в С++ ограни чено вумя. д • С автоматически делает регистровые перемен ные нерегистровыми, как только количество регистровых переменных достигнет предела.

Функции Функции

Подпрограммы • В основе конструкции функций лежит понятие подпрограммы, впервые введенное в 1957 г. Подпрограммы • В основе конструкции функций лежит понятие подпрограммы, впервые введенное в 1957 г. М. Уилксом. • Подпрограмма это само стоятельный фрагмент программы, оформленный особым способом, которой присвоено имя. • Подпрограмма – это одна из базовых структур в структурном программи ровании, позволяющая избежать повторных записей одинаковых фрагментов в программе. • Подпрограммы в C++ реализуются в виде функций.

Функции • В языке C++ нет деления на процедуры и функции. • В C++ Функции • В языке C++ нет деления на процедуры и функции. • В C++ программа состоит только из функций. • Функция это независимая совокупность объявле ний и операторов, обычно предназначенная для выполне ния определенной задачи. • Каждая функция имеет имя, которое используется для вызова функции.

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

Объявление функции • Формат описания функции: [тип] <имя функции> (список параметров) { тело функции Объявление функции • Формат описания функции: [тип] <имя функции> (список параметров) { тело функции }

Объявление функции • Тип определяет тип значения, которое возвращает функция с помощью оператора return. Объявление функции • Тип определяет тип значения, которое возвращает функция с помощью оператора return. • Если тип не ука зан, то по умолчанию предполагается, что функция воз вращает целое значение (типа int). • Список параметров состоит из перечня типов и имен параметров, разделен ных запятыми. • Функция может не иметь параметров, но круглые скобки необходимы в любом случае.

Объявление функции • В списке параметров для каждого параметра дол жен быть указан ип: Объявление функции • В списке параметров для каждого параметра дол жен быть указан ип: т f(int х, int у, float z)

Оператор return имеет два варианта использова ния : • оператор вызывает немедленный выход из Оператор return имеет два варианта использова ния : • оператор вызывает немедленный выход из текущей функции и возврат в вызывающую про грамму ; • оператор используется для возврата значения функции. В теле функции может быть не сколько операторов eturn, может не быть ни одного. В этом случае возврат в r вызывающую программу проис ходит после выполнения последнего оператора тела функции.

Пример 1 //Функция находит max из двух чисел. max(int a, int b) { int Пример 1 //Функция находит max из двух чисел. max(int a, int b) { int m; if (a>b) m=а; else m=b; return m; }

Пример программы #include <iostream> #include <conio. h> using namespace std; int max(int a, int Пример программы #include #include using namespace std; int max(int a, int b); // Объявление функции int main() { int a=50, b=100, d; cout << " a= " << a << " b= " << b << endl; d=max(a, b); cout << " max(a, b)= " << d << endl; while (!kbhit()); return 0; } max(int a, int b) //Описание функции { int m; if (a>b) m=а; else m=b; return m; }

Пример 1 //Та же функция, но без использования до полнительной переменной m max(int a, Пример 1 //Та же функция, но без использования до полнительной переменной m max(int a, int b) { if (a>b) return a; else return b; }

Пример программы #include <iostream> #include <conio. h> using namespace std; int max(int a, int Пример программы #include #include using namespace std; int max(int a, int b); // Объявление функции int main() { int a=50, b=100, d; cout << " a= " << a << " b= " << b << endl; d=max(a, b); cout << " max(a, b)= " << d << endl; while (!kbhit()); return 0; } max(int a, int b) //Описание функции { if (a>b) return a; else return b; }

Пример 1 //Укороченная запись той же функции max(int a, int b) { if (a>b) Пример 1 //Укороченная запись той же функции max(int a, int b) { if (a>b) return a; return b; }

Пример программы #include <iostream> #include <conio. h> using namespace std; int max(int a, int Пример программы #include #include using namespace std; int max(int a, int b); // Объявление функции int main() { int a=50, b=100, d; cout << " a= " << a << " b= " << b << endl; d=max(a, b); cout << " max(a, b)= " << d << endl; while (!kbhit()); return 0; } max(int a, int b) //Описание функции { if (a>b) return a; return b; }

Пример 1 //Еще более короткая запись той же функции max(int a, int b) { Пример 1 //Еще более короткая запись той же функции max(int a, int b) { return (a>b)? a: b; }

Пример программы #include <iostream> #include <conio. h> using namespace std; int max(int a, int Пример программы #include #include using namespace std; int max(int a, int b); // Объявление функции int main() { int a=50, b=100, d; cout << " a= " << a << " b= " << b << endl; d=max(a, b); cout << " max(a, b)= " << d << endl; while (!kbhit()); return 0; } int max(int a, int b) // Описание функции { return (a>b)? a: b; }

Возвращаемые значения • В случае, когда оператора return в теле функции нет или за Возвращаемые значения • В случае, когда оператора return в теле функции нет или за ним нет значения, то возвращаемое функцией значение неизвестно (не определено). • Если функция должна возвращать значение, но не делает этого, компилятор выдает предупреждение. • Все функции, возвращаю щие значения, могут использоваться в выражениях языка С++, но они не могут использоваться в левой части операто ра присваивания, за исключением тех случаев, когда воз вращаемым значением является указатель.

Возвращаемые значения • Использование функций, возвращающих указате ли, имеют некоторые особенности. • Указатели не Возвращаемые значения • Использование функций, возвращающих указате ли, имеют некоторые особенности. • Указатели не являются ни типом целое (int), ни типом беззнаковое целое (unsigned int). • Их значениями являются адреса памяти данных определенного типа, соответственно должна быть описана и функция.

Пример //описание функ ции, возвращающей указатель на тип har. Функция c находит в строке Пример //описание функ ции, возвращающей указатель на тип har. Функция c находит в строке первый пробел и возвращает его адрес. char *find(char *string) { int i=0; while ((string[i]!=' ')&&(string[i] !='')) i++; if (string[i]) return &string[i]; // возвращает адрес первого пробела else return NULL; // возврат нулевого указателя }

#include <iostream> #include <conio. h> using namespace std; char *find(char *string); int main() { #include #include using namespace std; char *find(char *string); int main() { char test_string[]={"One two three"}; cout << " test_string= " << test_string<

Функции • Когда функция не возвращает никакого значения, она должна быть описана как функция Функции • Когда функция не возвращает никакого значения, она должна быть описана как функция типа void (пустая). • Если не объявлять функцию типа void, тогда она по умолчанию будет иметь тип int и не возвращать ника кого значения. то вызовет Э предупреждающее сообщение компилятора, но не будет препятствием для компиляции.

Пример //функция вывода на экран горизонтальной строки, состоящей из заданного символа void gorizontal_line(char ch) Пример //функция вывода на экран горизонтальной строки, состоящей из заданного символа void gorizontal_line(char ch) { int i; for (i=0; i<80; i++) printf (“%c”, ch); }

Прототипы функций Прототипы функций

Прототипы функций • Для создания правильного машинного кода функ ции необходимо до ее первого Прототипы функций • Для создания правильного машинного кода функ ции необходимо до ее первого вызова сообщить компиля тору тип возвращаемого результата, а также количество и типы аргументов. • Для этой цели в С++ используется понятие прототипа функции. Формат : тип <имя функции> (список параметров);

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

Прототипы функций //Пример объявления прототипа функции: int func(int a, float b, char* с); //или Прототипы функций //Пример объявления прототипа функции: int func(int a, float b, char* с); //или так: int func(int, float, char*); Два этих объявления абсолютно равносильны.

Пример #include <stdio. h> float sqr(float a); // это прототип объявление функции main() { Пример #include float sqr(float a); // это прототип объявление функции main() { float b; b=5. 2; printf ("Квадрат числа %f равен %f", b, sqr(b)); } float sqr(float a) // это описание функции { return a*a; }

Прототипы функций нужно задавать в сле дующих случаях: • функция возвращает значение типа, отличного Прототипы функций нужно задавать в сле дующих случаях: • функция возвращает значение типа, отличного от int; • указатель на функцию должен быть инициализи рован до того, как функция будет определена. Это обеспе чивается заданием прототипа функции.

Глобальные, локальные и формальные парамет ры Глобальные, локальные и формальные парамет ры

Глобальные, локальные и формальные парамет ры • Область действия переменной это правила, кото рые Глобальные, локальные и формальные парамет ры • Область действия переменной это правила, кото рые устанавливают, какие данные доступны из данного места программы. • В языке С++ каждая функция это отдельный блок программы. Попасть в тело функции нельзя иначе, как через вызов данной функции. • В частности нельзя опера тором перехода oto перейти в g середину другой функции. • С точки зрения области действия переменных раз личают три типа переменных: лобальные, г локальные и формальные параметры. Правила области действия опре деляют, где каждая из них может применяться.

Локальные переменные • Локальные переменные это переменные, объяв ленные внутри блока, в частности внутри Локальные переменные • Локальные переменные это переменные, объяв ленные внутри блока, в частности внутри функции. • Язык С++ поддерживает простое правило: переменная может быть объявлена внутри любого блока программы. • Локальная переменная доступна внутри блока, в котором она объяв лена (блок открывается фигурной скобкой и закрывается фигурной скобкой). • Область действия ло кальной переменной блок. • Локальная переменная существует пока выполня ется блок, в котором эта переменная объявлена. При вы ходе из блока эта переменная ( и ее значение) теряется.

Пример #include <stdio. h> void f(); main() { int i; i=1; f(); printf( Пример #include void f(); main() { int i; i=1; f(); printf("B функции main значение i равно %dn", i); } void f() { int i; i=10; printf("B функции f() значение i равно %dn", i); }

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

Глобальные переменные • Глобальные переменные это переменные, объяв ленные вне какой либо функции. • Глобальные переменные • Глобальные переменные это переменные, объяв ленные вне какой либо функции. • В отличие от локальных переменных глобальные переменные могут быть исполь зованы в любом месте программы, но перед их первым использованием они должны быть объявлены. • Область действия глобальной переменной вся программа.

Глобальные переменные Недостатки: • занимают память в течение всего времени работы программы; • использование Глобальные переменные Недостатки: • занимают память в течение всего времени работы программы; • использование глобальных переменных делает функции менее общими и затрудняет их использование в других программах; • использование внешних переменных дает воз можным появление рудноотыскиваемых т ошибок из за побочных явлений.

Параметры и аргументы функции Параметры и аргументы функции

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

Пример void swap(int a, int b) { int r=a; a=b; b=r; } //Функция swap() Пример void swap(int a, int b) { int r=a; a=b; b=r; } //Функция swap() не будет менять местами значения параметров.

Параметры и аргументы функции • Если необходимо изменение переменных, то надо переда вать в Параметры и аргументы функции • Если необходимо изменение переменных, то надо переда вать в качестве параметра не значение, а адрес перемен ной, которую нужно изменить, т. е. передавать указатель на переменную. • Такой прием в языке С++ называется переда чей параметра по ссылке. • Вызванная функция должна описывать аргумент как ссылку и обращаться к фактиче ской переменной косвенно, через эту ссылку. • Если в каче стве аргумента берется имя массива, то передаваемое функции значение фактически есть адрес первого элемен та массива.

Пример void swap(int *а, int *b) { int r=*a; *a=*b; *b=r; } Пример void swap(int *а, int *b) { int r=*a; *a=*b; *b=r; }

Пример #include <stdio. h> #include <locale> void swap(int a, int b); void swap 1(int Пример #include #include void swap(int a, int b); void swap 1(int *a, int *b); main() { setlocale(LC_ALL, "rus"); int x=5, y=10; printf("Сначала x=%d y=%dn", x, y); swap(x, y); printf("Teпepь x=%d y=%dn", x, y); printf("Hичero не изменилосьn"); swap 1(&x, &y); // Передаются адреса переменных printf("Teпepь x=%d y=%dn", x, y); printf("Значения поменялись"); return 0; } void swap(int a, int b) { int r=a; a=b; b=r; } void swap 1(int *a, int *b) { int r=*a; *a=*b; *b=r; }

Рекурсивные функции Рекурсивные функции

Рекурсивные функции • В языке С++ функции могут вызывать сами себя. • Функция называется Рекурсивные функции • В языке С++ функции могут вызывать сами себя. • Функция называется рекурсивной, если оператор в теле функции содержит вызов этой же функции. • Классический пример рекурсивной функции это вычисление факториа ла числа !=1*2*3*. . . *n. n • Вызов функции в рекурсивной функции не создает новую копию функции, а создает в памяти новые копии локальных переменных и параметров. • Из рекурсивной функции надо предусмотреть выход, иначе это вызовет “зависание” системы.

Пример factorial(int n) { int а; if (n==1) return 1; a=factorial(n 1)*n; return а; Пример factorial(int n) { int а; if (n==1) return 1; a=factorial(n 1)*n; return а; }

Директивы препроцессора Директивы препроцессора

Препроцессор • Препроцессор языка C++ это программа, выпол няющая обработку входных данных для другой Препроцессор • Препроцессор языка C++ это программа, выпол няющая обработку входных данных для другой программы. • Препроцессор просматривает программу до компилятора, заменяет аббревиатуры в тексте программы на соответствующие директивы, отыскивает и подключает необходимые файлы, может влиять на усло вия компиляции. • Директивы препроцессора не являются языком С, они расширяют область действия среды программирования среды С. • Все директивы начинаются с символа #.

Директивы препроцессора Директива Описание #define Описание макроса #undef Отмена определения макроса #if Включение объекта Директивы препроцессора Директива Описание #define Описание макроса #undef Отмена определения макроса #if Включение объекта заголовка #ifdef Компиляция, если выражение истинно #else Компиляция, если выражение в if ложно #elif Составная директива else/if #endif Окончание группы компиляции по условию #error Формирование ошибок трансляции #pragma Действие определяется реализацией # Null директива

Директива #define Директива #define

#define • Директива #define вводит макроопределение (макрос) или символическую константу. • Формат: #define <имя #define • Директива #define вводит макроопределение (макрос) или символическую константу. • Формат: #define <имя макроса> <последовательность символов> • Последовательность символов иногда называют строкой замещения. • Когда препроцессор находит в ис ходном тексте программы имя макроса (в дальнейшем макрос), он заменяет его на последовательность симво лов макроподстановка. • Для имени макроса принято использовать прописные буквы.

Пример #define TRUE 1; исходном файле #define FALSE 0; FALSE. #define MAX 100; //1 Пример #define TRUE 1; исходном файле #define FALSE 0; FALSE. #define MAX 100; //1 и 0 заменяют в //имена TRUE и

Пример #include <stdio. h> #define A 3 int main(){ printf( Пример #include #define A 3 int main(){ printf("%d + %d = %d", A, A, A+A); // 3 + 3 = 6 getchar(); return 0; }

#define В зависимости от значения константы компилятор присваивает ей тот или иной тип. С #define В зависимости от значения константы компилятор присваивает ей тот или иной тип. С помощью суффиксов можно переопределить тип константы: • U или u целая беззнаковая(unsigned); • F или f вещественная типа float; • L или l long int / long double.

Пример #define A 280 U // unsigned int #define B 280 LU // unsigned Пример #define A 280 U // unsigned int #define B 280 LU // unsigned long int #define C 280 // int (long int) #define D 280 L // long int #define E 28. 0 // double #define F 28. 0 F // float #define G 28. 0 L // long double

#define • Второй вариант синтаксиса определяет макрос, подобный функции, с параметрами. • Данная форма #define • Второй вариант синтаксиса определяет макрос, подобный функции, с параметрами. • Данная форма допускает использование необязательного списка параметров, которые должны находиться в скобках.

Пример //Вычисление синуса угла #include <stdio. h> #include <stdlib. h> #include <math. h> #define Пример //Вычисление синуса угла #include #include #include #define PI 3. 14159265 #define SIN(x) sin(PI*x/180) int main() { int c; printf("Введите угол в градусах: "); scanf("%d", &c); printf("sin(%d)=%lf", c, SIN(c)); getchar(); return 0; }

#define • Отличием макроопределений от функций является то, что на этапе компиляции каждое вхождение #define • Отличием макроопределений от функций является то, что на этапе компиляции каждое вхождение идентификатора замещается соответствующим кодом, т. е. программа может иметь несколько копий одного и того же кода, соответствующего идентификатору. • В случае работы с функциями программа будет содержать 1 экземпляр кода, реализующий указанную функцию, и каждый раз при обращении к функции ей будет передано управление. • Отменить макроопределение можно с помощью директивы #undef.

Пример неудачного использования #include <stdio. h> #define sum(A, B) A+B int main(){ int a, Пример неудачного использования #include #define sum(A, B) A+B int main(){ int a, b, c, d; a=3; b=5; printf(" a = %dn b = %dn", a, b); c = (a + b)*2; // c = (a + b)*2 d = sum(a, b) * 2; // d = a + b*2; printf(" c = %d n d = %d n", c, d); getchar(); return 0; }

Условная компиляция Условная компиляция

Условная компиляция Директивы #if или #ifdef / #ifndef вместе с директивами #elif, #else и Условная компиляция Директивы #if или #ifdef / #ifndef вместе с директивами #elif, #else и #endif управляют компиляцией частей исходного файла. Если указанное выражение после #if имеет ненулевое значение, в записи преобразования сохраняется группа строк, следующая сразу за директивой #if. Отличие директив #ifdef/#ifndef заключается в том, что константное выражение может быть задано только с помощью #define.

Условная компиляция Синтаксис: #if константное выражение группа операций #else группа операций #endif Условная компиляция Синтаксис: #if константное выражение группа операций #else группа операций #endif

Условная компиляция • У каждой директивы #if в исходном файле должна быть соответствующая закрывающая Условная компиляция • У каждой директивы #if в исходном файле должна быть соответствующая закрывающая директива #endif. • Между директивами #if и #endif может располагаться любое количество директив #elif, однако допускается не более одной директивы #else. • Директива #else, если присутствует, должна быть последней перед директивой #endif.

Пример #include <stdio. h> #include <stdlib. h> #define A 2 int main() { #if Пример #include #include #define A 2 int main() { #if A==1 printf("Выполняется ветвь 1"); #elif A==2 printf("Выполняется ветвь 2, А=%d", A); #else printf("Выполняется третья ветвь, А=%d", A); #endif getchar(); return 0; }

Директива #include Директива #include

#include • Директива #include подключает к исходному тек сту заданные в директивы файлы. • #include • Директива #include подключает к исходному тек сту заданные в директивы файлы. • Данные файлы называют подключаемыми, заголовочными файлами и заголовка ми. • Часто в качестве подключаемых файлов используют ся заголовочные файлы библиотек языка С. • Формат: #include <имя заголовка>; #include "имя заголовка";

#include • Если имя файла заключено в угловые скобки (<>), считается, что нам нужен #include • Если имя файла заключено в угловые скобки (<>), считается, что нам нужен некий стандартный заголовочный файл, и компилятор ищет этот файл в предопределенных местах. • Двойные кавычки означают, что заголовочный файл пользовательский, и его поиск начинается с того каталога, где находится исходный текст программы. • Каждая библиотечная функция, определенная стандартом С, имеет прототип в соответствующем заголо вочном файле. • В соответствии со стандартом ANSI имеет 15 заголовочных файлов.

Основные заголовочные файлы стандарта ANSI stdio. h Библиотека стандартного ввода/вывода stdlib. h Функции общего Основные заголовочные файлы стандарта ANSI stdio. h Библиотека стандартного ввода/вывода stdlib. h Функции общего назначения string. h Функции работы со строками символов time. h Функции работы с датами и временем errno. h Проверка ошибок float. h Работа с числами с плавающей точкой limits. h Определение размеров циклических типов locale. h Поддержка интернациональной среды math. h Математическая библиотека setjmp. h Возможности нелокальных переходов signal. h Обработка сигналов stdarg. h Поддержка функций с неопределенным числом параметров

Ввод/вывод данных Работа с файлами Ввод/вывод данных Работа с файлами

Ввод/вывод данных • Стандарт ANSI называется бу феризированным buffered) или ( форматированным (formated) вводом/выводом. Ввод/вывод данных • Стандарт ANSI называется бу феризированным buffered) или ( форматированным (formated) вводом/выводом. • В тоже время используется и другой метод ввода/вывода, UNIX подобный, или неформатированный (небуферизированный) ввод/вывод.

Стандарт ANSI • Система ввода/вывода языка С++ поддерживает интерфейс, не завися щий от того, Стандарт ANSI • Система ввода/вывода языка С++ поддерживает интерфейс, не завися щий от того, какое в действительности используется физическое устройство ввода/вывода, т. е. есть абстрактный уровень между программистом и физическим устройством. Данная абстракция и называется потоком. • Способ хранения информации на физическом устройстве называется файлом.

Стандарт ANSI • Стандарт ANSI языка С связывает каждое из различных устройств (дисковод, клавиатура, Стандарт ANSI • Стандарт ANSI языка С связывает каждое из различных устройств (дисковод, клавиатура, терминал, и тд. ) с логическим ус тройством, называемым потоком. Так как потоки не за висят от физических устройств, то одна и та же функция может записывать информацию на диск или выводить ее на экран. • В языке существует два типа потоков: те кстовый text) и двоичный (binary). (

Стандарт ANSI • Текстовый поток это последовательность симво лов. ри этом может не быть Стандарт ANSI • Текстовый поток это последовательность симво лов. ри этом может не быть П взаимооднозначного соот ветствия между символами, которые передаются в потоке и выводятся на экран. Среди символов пара может соот ветствовать возврату каретки или символу табуляции. • Двоичный поток это последовательность байтов, которые взаимно однозначно соответствуют тому, что находится на внешнем устройстве.

Стандарт ANSI • По ток ожет быть связан с файлом с помощью оператора м Стандарт ANSI • По ток ожет быть связан с файлом с помощью оператора м открытия файла. Как только файл открыт, то информация может передаваться между ним и вашей программой. • Все файлы разные по своей сути. Из файла на диске можно выбрать 5 ю запись или заменить 10 ю за пись. В то же время в файл, связанный с печатающим устройством, информация может передаваться только последовательно в том же порядке. • Главное различие между потоками и файлами: все потоки одинаковы, все файлы разные. • Каждый поток, связанный с файлом, имеет структуру называемую FILE.

Консольный ввод/вывод Консольный ввод/вывод

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

Функции ввода/вывода • getche() читает символ с клавиатуры и ото бражает введенный символ на Функции ввода/вывода • getche() читает символ с клавиатуры и ото бражает введенный символ на экране. Прототип в фай ле ONIO. H; C • putchar() выводит символ, который является ее аргументом, на экран в текущую позицию курсора. Прототип в файле STDIO. H; • getchar() читает символ с клавиатуры, но требует нажатия клавиши ENTER. Прототип в файле STDIO. H; • getch() читает символ с клавиатуры, но не вы водит символ на экран (без эхо возврата). Прототип в файле STDIO. H; • gets() ввод строки символов с клавиатуры. Прототип в файле STDIO. H; • puts() вывод строки символов на экран. Прототип в файле STDIO. H.

Функции ввода/вывода • В дополнение к расмотренным функциям кон сольного ввода/вывода, библиотека содержит две Функции ввода/вывода • В дополнение к расмотренным функциям кон сольного ввода/вывода, библиотека содержит две функ ции, которые выполняют форматированный в/в. • Форматированный в/в означает, что функции могут чи тать и выводить данные в разном формате, которым мож но управлять. • Функция printf() выполняет форматированный вывод данных на консоль, имеет прототип в файле STDIO. H. • Функция scanf() выполняет ввод с консоли и ав томатически преобразует введенное число в заданный формат. Прототип в файле STDIO. H.

Работа с файлами Работа с файлами

Работа с файлами • Библиотека ввода вывода С++ вклю чает средства для работы с Работа с файлами • Библиотека ввода вывода С++ вклю чает средства для работы с последовательными файлами. • Логически последовательный файл можно представить как именованную цепочку (ленту, строку) байтов, имею щую начало и конец. • Последовательный файл отличается от файлов с другой организацией тем, что чтение (или за пись) из файла (в файл) ведется байт за байтом от начала к концу.

Работа с файлами • В каждый момент позиции в файле, откуда выпол няется чтение Работа с файлами • В каждый момент позиции в файле, откуда выпол няется чтение и куда производится запись, определяются значениями указателей позиций записи и чтения файла (в дальнейшем указатель на файл file pointer). • Указатель на файл является связующим звеном между файлом и пото ком. • Указатель на файл определяет не только текущую позицию записи (чтения), а также имя файла на диске, структуру типа FILE. • Структура типа файл определена в заголовке stdio. h. В этом же файле stdio. h определены функции для работы с файлами

Функции для работы с файлами Функция Действие функции fopen() Открыть файл fclose() Закрыть файл Функции для работы с файлами Функция Действие функции fopen() Открыть файл fclose() Закрыть файл fputc() Записать символ в файл fgetc() Прочитать символ из файла fseek() Изменить указатель позиции файла на указанное место fprintf() Форматная запись в файл fscanf() Форматное чтение из файла feof() Возвращает значение TRUE, если дос тигнут конец файла ferror() Возвращает значение FALSE, если обнаружена ошибка

Функции для работы с файлами Функция Действие функции fread() Читает блок данных из потока Функции для работы с файлами Функция Действие функции fread() Читает блок данных из потока fwrite() Пишет блок данных в поток rewind() Устанавливает указатель позиции фай ла на начало remove() Уничтожает файл

Открытие и закрытие файла. Функции FOPEN() и FCLOSE() Открытие и закрытие файла. Функции FOPEN() и FCLOSE()

Открытие и закрытие файла • Перед началом работы с файлом его надо создать (открыть), Открытие и закрытие файла • Перед началом работы с файлом его надо создать (открыть), а по окончании работы закрыть. • Перед началом работы с файлом надо создать ука затель на структуру данных типа FILE. • Затем необходимо вызвать функцию fopen(), которая может создать новый файл для записи в него, либо открыть су ществующий на диске файл для записи или (и) чтения. • После вызова этой функции создается структура типа FILE и указатель f содержит адрес начала этой структуры в памяти. Кроме того, в ОП отво дится 512 байт для обмена данными между файлом на диске и программой. Этот массив называется буфером. • При закрытии файла, память отведенная под эту структуру и буфер, обнуляется, указатель f также обнуля ется, это означает, что указатель f ни на что не указывает.

Функция fopen() функция открытия файла • Функция fopen() функция открытия файла. Формат: fopen(<имя файла>, Функция fopen() функция открытия файла • Функция fopen() функция открытия файла. Формат: fopen(<имя файла>, <аргумент>), где аргумент символьная константа, определяющая ре жим открытия айла. ф

Функция fopen() функция открытия файла Режимы открытия файла: • r чтение; • w запись; Функция fopen() функция открытия файла Режимы открытия файла: • r чтение; • w запись; • а добавление; • r+ чтение и запись с обновлением; • w+ запись с обновлением; • а+ чтение и добавление; • и др.

Пример FILE *out; out=fopen(“q 1 Пример FILE *out; out=fopen(“q 1", "w"); Примечание: • Служебное слово FILE записывается заглавны ми буквами; • Аргументы, определяющие режим доступа в функции fopen() записываются только маленькими бук вами.

Пример // Пример Открытие (создание) нового файла #include <stdio. h> main () { int Пример // Пример Открытие (создание) нового файла #include main () { int n; FILE *f; f=fopen("test. dat", "w"); fclose(f); }

Запись и чтение символа Запись и чтение символа

Запись и чтение символа Для побайтной записи в файл используется функ ция putc(). f Запись и чтение символа Для побайтной записи в файл используется функ ция putc(). f Формат: fputc(<переменная>, <имя файла>); где: переменная символьная переменная, значение кото рой записывается в файл; имя файла файл, в который выполняется запись символа.

Пример // Пример Побайтная запись в файл. Функция fputc() #include <stdio. h> main () Пример // Пример Побайтная запись в файл. Функция fputc() #include main () { int n; FILE *f; f=fopen ("test. dat", "w"); fputc('A', f); fclose (f); }

Пример / /Пример 31. Побайтная запись в файл #include <stdio. h> main() { int Пример / /Пример 31. Побайтная запись в файл #include main() { int n; FILE *f; char c=‘z’; f=fopen(“test. dat”, ”w”); for (n=0; n<10; n++) fputc(c, f); fclose(f); }

Пример // Пример 32. Побайтная запись в файл #include <stdio. h> main() { int Пример // Пример 32. Побайтная запись в файл #include main() { int n, k; FILE *f; char c=‘z’; f=fopen(“test. dat”, ”w”); for (n=0; n<5; n++) { for (k=0; k<10; k++) fputc(c, f); fputs(“n”, f); } fclose(f); }

Примечание В программе используется функция fputs(), кото рая записывает в файл последовательность символов n Примечание В программе используется функция fputs(), кото рая записывает в файл последовательность символов n (функция fputc() записывает один символ). Управляю щий имвол n при записи в файл с превращается в два символа: • символ возврата каретки (код 0 D); • символ перевода строки (код 0 А).

Запись и чтение символа • Чтение символа из файла. Функция FGETC() • Формат: fgetc(<имя Запись и чтение символа • Чтение символа из файла. Функция FGETC() • Формат: fgetc(<имя файла>);

Определение конца файла • В операционной системе MS DOS принято согла шение: признаком конца Определение конца файла • В операционной системе MS DOS принято согла шение: признаком конца текстового файла является сим вол CTRL Z (код 26). • Т. о. , если из файла будет прочитан байт, в котором хранится число 26, то функция fgetc() примет значение ( 1), что означает конец файла. • В файле stdio. h объявлена константа EOF, равная ( 1).

Пример /* Пример Побайтное чтение из файла. */ include <stdio. h> main() { int Пример /* Пример Побайтное чтение из файла. */ include main() { int с; FILE *f; clrscr(); f=fopen(“test. dat”, ”r”); printf("Pезультаты чтения данных из файла test. dat: n”); while ((c=fgetc(f)) !=EOF) printf(“%c”, c); fclose(f); }