Опубликован: 25.08.2010 | Доступ: свободный | Студентов: 6102 / 599 | Оценка: 3.91 / 3.44 | Длительность: 11:09:00
Лекция 4:

Функции

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >

Функции стандартной библиотеки

Любая программа на С++ содержит обращения к стандартной библиотеке, в которой находятся определения типов, констант, макросов, функций и классов.

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

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

Ниже приведен краткий обзор основных функций.

Функции ввода/вывода

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

Для использования функций ввода/вывода в стиле С необходимо подключить к программе заголовочный файл <stdio.h> или <cstdio>. При вводе/выводе данные рассматриваются как поток байтов. Физически поток представляет собой файл или устройство, например, клавиатуру или дисплей, рассматривающиеся как частный случай файла.

Открытие потока

Работа с потоком начинается с его открытия. Поток можно открыть для чтения и/или записи в двоичном или текстовом режиме. Функция открытия потока имеет формат:

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

При успешном открытии потока функция возвращает указатель на предопределенную структуру типа FILE, содержащую всю необходимую для работы с потоком информацию, или NULL в противном случае. Первый параметр - имя открываемого файла в виде С-строки, второй - режим открытия файла:

"r" - файл открывается для чтения;

"w" - открывается пустой файл для записи (если файл существует, он стирается);

"a+" - файл открывается для добавления информации в его конец;

"r+" - файл открывается для чтения и записи (файл должен существовать);

"w+" - открывается пустой файл для чтения и записи (если файл существует, он стирается);

"a" - файл открывается для чтения и добавления информации в его конец.

Режим открытия может также содержать символы t (текстовый режим) или b (двоичный режим), отличающиеся обработкой символов перехода на новую строку. По умолчанию файл открывается в текстовом режиме, при котором комбинация символов "возврат каретки" и "перевод строки" (0x13 0x10) при вводе преобразуются в одиночный символ перевода строки (при выводе выполняется обратное преобразование). В двоичном режиме преобразования не выполняются.

Пример:

FILE *f = fopen("d:\\cpp\\data.txt", "rb+");

Указатель f используется в дальнейших операциях с потоком. Его передают функциям ввода/вывода в качестве параметра.

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

Существует пять предопределенных потоков, которые открываются в начале работы программы: стандартный ввод stdin, стандартный вывод stdout, стандартный вывод сообщений об ошибках stderr, стандартный дополнительный поток stdaux и стандартная печать stdprn.

Ввод/вывод в поток

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

Операции ввода/вывода выполняются начиная с текущей позиции потока, определяемой положением указателя потока. Указатель устанавливается при открытии на начало или конец файла (в соответствии с режимом открытия) и изменяется автоматически после каждой операции ввода/вывода.

Ниже перечислены основные функции ввода/вывода потока.

  • Чтение и запись потока байтов выполняют функции fread и fwrite.
  • Чтение символа из потока - getc, fgetc, из стандартного потока stdin - getchar.
  • Запись символа в поток - putc, fputc, в стандартный поток stdout - putchar.
  • Чтение строки из потока - fgets, из стандартного потока stdin - gets.
  • Запись строки в поток - fputs, в стандартный поток stdout - puts.
  • Форматированный ввод из потока - fscanf, из стандартного потока stdin - scanf, из строки - sscanf.
  • Форматированный вывод в поток - fprintf, в стандартный поток stdout - printf, в строку - sprintf.
Закрытие потока

Поток закрывается либо при завершении программы, либо явным образом с помощью функции fclose:

int fclose(FILE*);

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

Пример работы с потоками

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

#include <cstdio>
#include <cstdlib>
#include <cconio>
#include <iostream>
using namespace std;
int main()
{
FILE *fi, *fo;
if((fi = fopen("d:\\c\\binfile.txt", "r"))==0)
  {
  cout << "Ошибка открытия входного файла"; 
  return 1;
  };
if((fo = fopen("d:\\c\\binfile.out", "w+b"))==0)
  {
  cout << "Ошибка открытия выходного файла"; 
  return 1;
  };
const int dl = 80;
char	  s[dl];
struct 
  {
  char type[20];
  int	 opt, rozn;
  char	 comm[40];
  }mon;
while (fgets(s, dl, fi))
  {
  // Преобразование строки в структуру:
  strncpy(mon.type, s, 19);	//Описание strncpy см. в след. разделе
  mon.opt = atoi(&s[20]);	//Описание atoi см. в след. разделе
  mon.rozn = atoi(&s[25]);
  strncpy(mon.comm, &s[30], 40);
  fwrite(&mon, sizeof mon, 1, fo);	
  }
fclose(fi);
int i; cin >> i;			//	Номер записи
// Установка указателя текущей позиции файла на запись i
fseek(fo, (sizeof mon)*i, SEEK_SET);
fread(&mon, sizeof mon, 1, fo);
cout << "mon.type " 
	 << mon.type << " opt " 
	 << mon.opt << " rozn "
	 << mon.rozn << endl;
	fclose(fo);
}

Допустим, что в файле хранятся сведения о мониторах. В каждой строке указан тип, оптовая и розничная цены и примечание. Для простоты данные в каждой строке записаны единообразно: первые 20 символов занимает тип монитора, далее по 5 символов оптовая и розничная цена, затем примечание длиной не более 40 символов.

Функции работы со строками и символами

Строка представляет собой массив символов, заканчивающийся нуль-символом. В С++ есть две возможности работы со строками: функции, унаследованные из библиотеки С (заголовочный файл <string.h> или <cstring>), и библиотечный класс С++ string, предоставляющий более широкие возможности представления, обработки и контроля строк.

Библиотека С содержит функции копирования строк ( strcpy, strncpy ), сравнения ( strcmp, strncmp ), объединения строк ( strcat, strncat ), поиска подстроки ( strstr ), поиска вхождения символа ( strchr, strrchr, strpbrk ), определения длины строки ( strlen ) и др.

В заголовочных файлах <stdlib.h> и <cstdlib> содержатся полезные функции преобразования строк в числа:

double atof(const char* p);	//преобразует переданную строку в double
int atoi(const char* p);		//преобразует переданную строку в int
long atol(const char* p);		//преобразует переданную строку в long

Пробелы и табуляции в начале строки пропускаются. Преобразование прекращается при встрече недопустимого символа или конца строки. Если строку нельзя преобразовать в число, возвращается 0.

Для работы с символами в стандартной библиотеке (заголовочные файлы <ctype.h> и <cctype>) есть следующие функции:

Таблица 4.1.
Имя Проверка на принадлежность символа множеству
isalnum букв и цифр (A-Z, a-z, 0-9)
isalfa букв (A-Z, a-z)
iscntrl управляющих символов (с кодами 0..31 и 127)
isdigit цифр (0-9)
isgraph Печатаемых символов, кроме пробела ( isalfa | isdigit | ispunct )
islower букв нижнего регистра (a-z)
isprint Печатаемых символов
ispunct знаков пунктуации
isspace символов-разделителей
isupper букв верхнего регистра (A-Z)
isxdigit шестнадцатеричных цифр (A-F, a-f, 0-9)

Математические функции

С++ унаследовал из С стандартные математические функции, описание которых находится в заголовочных файлах <stdlib.h>, <math.h> и <cmath>. Они позволяют получить абсолютное значение ( abs, fabs ), округленное число ( ceil, floor ), квадратный корень ( sqrt ), степень ( pow ), значения тригонометрических функций ( sin, cos, tan, sinh, и т. п.), экспоненту ( exp ), логарифм ( log, log10 ), дробную и целую часть числа ( modf ), остаток от деления ( fmod ) и некоторые другие.

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Dana Kanatkyzi
Dana Kanatkyzi
Здравствуйте.Помогите решить задачу минимум 4 чисел.Условие такое:"Напишите функцию int min (int a, int b, int c, int d) (C/C++)"находящую наименьшее из четырех данных чисел."Заранее спасибо!
Юрий Семевский
Юрий Семевский
Россия, Санкт-Петербург
Александр Богдашов
Александр Богдашов
Россия