%[*][ширина][F/N] [h/l] символ_формата
. Функция sprintf()
Формат функции такой: sprintf(string, Control, arg1, arg2, ... , argn);
Эта функция аналогична printf(), за исключением того, что результат своей работы она выводит не на стандартное устройство вывода, а в строку string. Это позволяет собирать в одну строку данные совершенно разных типов. Функция sscanf() Формат функции: sscanf(string, Control, arg1, arg2, ... , argn); Эта функция аналогична scanf(), за исключением того, что входные данные для ее работы поступают не со стандартного устройства ввода, а из строки string. Это позволяет выделять в строке различные группы данных совершенно разных типов и помещать их в отдельные переменные.
. Функция cprintf()
Параметры аналогичны параметрам printf(). Но для обеспечения работы этой функции следует подключить к программе файл conio.h, выполнив #include Если функция printf() выводит данные туда, куда назначен stdout, то функция cprintf() всегда выводит данные на консоль (на это указывает символ 'с' в начале ее имени), т.е. на экран. В отличие от printf(), функция cprintf() не переводит символ '\n' в пару "\r\n" - возврат каретки и перевод строки (вместо '\n' надо указывать оба этих символа). Кроме того, символы табуляции '\t' не преобразуются в пробелы. Эту функцию не рекомендуется использовать для приложений Win32 или Win32 GUI. Но ее можно использовать для выдачи на экран цветных сообщений. Для этого надо воспользоваться функциями textcolor() (установить цвет текста) и textbackground() (установить цвет фона).
. Функция gets()
Формат функции: gets(s);
Вводит строку символов с клавиатуры и записывает ее в строку s, которая может быть объявлена как char *s или char s[].
. Функция puts()
Формат функции: puts(s);
Выводит содержимое строки s на устройство стандартного вывода (экран). Строка s может быть объявлена как char *s или char s[].
. Функция cputs()
Формат функции: сputs(s);
Выводит содержимое строки s на экран (s может быть объявлена как char *s или char s[]). Эту функцию можно использовать для вывода на экран цветных текстов. Цвет выводимых символов задается с помощью функции textcolor(), а цвет фона - функцией textbackground(). Для работы функции надо подключить файл conio.h.
10. Функция gotoxy()
Формат функции: gotoxy(x, y);
Переводит курсор в точку с координатами (x, y) в текущем окне на экране, где х - номер столбца экрана, y - номер строки экрана. Обе переменные должны быть описаны как int (не в пикселах). Для работы функции надо подключить файл conio.h.
11. Функция clrscr()
Формат функции: clrscr();
Очищает экран и закрашивает его цветом, заданным функцией textbackground().
Ввод и вывод в С++ организован с помощью так называемых поточных классов, содержащих данные и методы работы с файлами по вводу/выводу. Поточные классы происходят от общего предка - класса ios и потому наследуют его функциональность. Чтобы начать писать программу с использованием ввода/вывода на языке С++, следует обязательно выполнить в программе:
#include <fstream>
Класс fstream является потомком классов istream и ostream. Эти же классы являются родителями классов ifstream и оfstream. Класс fstream используется для организации ввода/вывода (т. е. чтения-записи) в один и тот же файл. Классы ifstream, оfstream - для организации соответственно ввода (чтения) файла и вывода (записи в файл). В свою очередь, экземплярами классов istream, ostream являются cin, cout, cerr, с помощью которых осуществляется так называемый стандартный ввод/вывод - ввод со стандартного вводного устройства, которым по умолчанию является клавиатура, и вывод на стандартное выводное устройство, которым по умолчанию является экран. Таким образом, включения в программу класса fstream оказывается достаточным для организации как стандартного, так и файлового ввода/вывода. Файловый ввод/вывод организован с помощью переопределенных в поточных классах операций включения (<>).
Чтобы работать с файлом, его сначала следует открыть - связать со специальной структурой, в которой задаются характеристики файла (размер буфера ввода/вывода, состояние файла, последняя прочитанная запись и т. п.). Связь эта выполняется с помощью функции open(), входящей в один из классов, который определяет ввод/вывод (fstream, istream, ostream). Поэтому, чтобы выполнить такую функцию, следует сначала создать экземпляр соответствующего класса, чтобы получить доступ к этой функции. Если мы, например, хотим выполнять вывод в файл (т. е. запись в него), то следует создать экземпляр класса ostream: ostream exp; и затем выполнить функцию
exp.open().
В скобках должны быть указаны параметры этой функции: имя открываемого файла и способ открытия файла, в котором задаются сведения о том, как пользователь собирается работать с файлом: читать его, писать в него или делать что-то еще. После того как файл открыт для чтения или записи, используют операции включения извлечения (<>). Если использовать пример с экземпляром exp класса ostream, то можно записать, например:
exp << "строка текста" << i << j << endl;
Здесь i, j - некоторые переменные (например, int i; float j;), endl - конец вывода и переход на новую строку. После того как работа с файлом закончена, следует закрыть файл, чтобы разорвать связь с той структурой, с которой файл был связан при его открытии. Это необходимо, чтобы дать возможность другим файлам "открываться". Этот акт выполняется с помощью метода close() того же экземпляра класса, который мы создавали, чтобы выполнить функцию open(). В нашем случае следовало бы написать:
exp.close();
Поточные классы - это поставщики инструментов для работы с файлами. В поточных классах хранятся:
- структуры, обеспечивающие открытие/закрытие файлов;
- функции (методы) открытия/закрытия файлов;
- другие функции и данные, обеспечивающие собственно ввод/вывод.
При использовании поточных классов языка С++ в основной программе требуется писать директиву:
using namespace::std;
В противном случае программа не пройдет компиляцию. В листинге 1 приводится пример использования директив пространства имен.
Листинг 1.
#include <vcl.h>
#include <iostream>
#include <conio.h>F
{x = 9;
}G
{namespace F;y = 2.0;INNER_G
{z = 10.01;
}
}main()
{namespace G;namespace G::INNER_G;x = 19.1;::cout << "x = " << x << std::endl;::cout << "y = " << y << std::endl;::cout << "z = " << z << std::endl;();
return 0;
}
В результате на экране появится:
x = 19.1
y = 2
z = 10.01
std::cout - это стандартный вывод. Здесь показано, что объект cout принадлежит пространству имен std.
1. Работа с классом fstream
Члены этого класса позволяют открыть файл, записать в него данные, пере- местить указатель позиционирования в файле (указатель, показывающий, на каком месте в файле мы находимся) в то или иное место, прочитать данные.
Этот класс имеет следующие основные функции (методы):
open() - открывает файл;
close() - закрывает файл;
is_open() - если файл открыт, то возвращает true, иначе - false;
rdbuf() - выдает указатель на буфер ввода/вывода.
Формат функции open(): open(char* file_name, open_mode);
где file_name - имя открываемого файла, open_mode - способ открытия файла. Способ открытия файла задается значением перечислимой переменной: enum open_mode {app, binary, in, out, trunc, ate}; Эта переменная определена в базовом классе ios, поэтому обращение к перечислимым значениям в классе fstream, с экземпляром которого мы работаем, должно идти с указанием класса-родителя: ios::app, ios::binary и т. д.
Назначение способов открытия файла:
app - открыть файл для дозаписи в его конец;
binary - открыть файл в бинарном виде (такие файлы были записаны по определенной структуре данных и поэтому должны читаться по этой же структуре);
in - открыть файл для чтения;
out - открыть файл для записи в его начало. Если файл не существует, он будет создан;
trunc - уничтожить содержимое файла, если файл существует (очистить файл);
ate - установить указатель позиционирования файла на его конец.
При задании режимов открытия файла можно применять оператор логического ИЛИ (|), чтобы составлять необходимое сочетание режимов открытия. Приведем пример программы работы с классом fstream (листинг 2). Результат работы показан на рисунке 1.
Листинг 2.
#include <vcl.h>
#include <iostream>
#include <fstream>
#include <stdio.h>main()
{namespace std;inout;.open("fstream.out", ios_base::in | ios_base::out | ios_base::trunc);<< "This is the story1 of a man" << endl;<< "This is the story2 of a man" << endl;<< "This is the story3 of a man" << endl;p[100];.seekg(0);.getline(p, 100);<< endl << "String1 :" << endl;<< p;::pos_type pos = inout.tellg();.getline(p, 100);<< endl << "String2 :" << endl;<< p;.getline(p, 100);<< endl << "String3 :" << endl;<< p;.seekp(pos);<< "This is the story2 of a man" << endl;<< "This is the story3 of a man" << endl;.seekg(0);<< endl << endl << inout.rdbuf();.close();("DEL FSTREAM.OUT");();
}
Рисунок 1.
2. Работа с классом ofstream
Класс ofstream предназначен для организации работ по выводу (записи) в файл с помощью методов этого класса:
open() - открывает файл для записи в него информации;
is_open() - возвращает true, если файл открыт, и false - в противном случае;
put() - записывает в файл один символ;
write() - записывает в файл заданное число символов;
skeep() - перемещает указатель позиционирования в заданное место файла;
tellp() - выдает текущее значение указателя позиционирования;
close() - закрывает файл;
rdbuf() - выдает указатель на буфер вывода (этот буфер находится в структуре, с которой связывается файл при его открытии).
В листинге 3 приведен пример использования класса ofstream.
Листинг 3.FILE;.open("a.txt");(FILE == NULL) return(0);(int i = 0; i < 2; i++)<< "string " << i << endl;.close();
. Работа с классом ifstream
Класс ifstream предназначен для организации работ по вводу (чтению) из файла с помощью методов этого класса:
open() - открывает файл для чтения из него информации;
is_open() - возвращает true, если файл открыт, и false - в противном случае;
get() - читает из файла один символ;
read() - читает из файла заданное число символов;
eof() - возвращает ненулевое значение, когда указатель позиционирования в файле достигает конца файла;
peek() - выдает очередной символ потока, но не выбирает его (не сдвигает указатель позиционирования данного в файле);
seekg() - перемещает указатель позиционирования в заданное место файла;
tellg() - выдает текущее значение указателя позиционирования;
close() - закрывает файл;
rdbuf() - выдает указатель на буфер ввода (этот буфер находится в структуре, с которой связывается файл при его открытии).
Пример использования класса приведен в листинге 4.
Листинг 4.FILE;p[100];.open("a.txt");(FILE == NULL) return(0);(!FILE.eof())
{>> p;<< p << endl;
}.close();
Стандартный ввод/вывод является частным случаем файлового ввода/вывода. При файловом вводе/выводе мы объявляли экземпляры соответствующих поточных классов и затем пользовались методами и операциями << и >>. Но классы istream, ostream, лежащие в основе поточных классов, содержат стандартные объекты-экземпляры классов с именами cout (экземпляр класса для стандартного ввода), cin (экземпляр класса для стандартного вывода) и сerr (экземпляр класса для стандартного вывода сообщений об ошибках).
При запуске любой программы на языке С+ + эти стандартные потоки определены (открыты) и по умолчанию назначены на стандартное вводное устройство - клавиатуру (cin), на стандартное выводное устройство - экран (cout и cerr). Причем все эти устройства синхронно связаны с соответствующими указателями stdin, stdout, stderr. Так что работа со стандартным вводом/выводом сводится к тому, что вместо задаваемых пользователем имен экземпляров соответствующих классов задаются имена стандартных экземпляров классов: cin, cout. Открывать ничего не нужно, надо только использовать операции <> и операции форматирования. Если мы пишем имена переменных, из которых выводятся или в которые вводятся данные, то по умолчанию для ввода/вывода используются определенные форматы. Например, запишем:
cout << i;
В этом случае значение i выведется на экран в формате, определенном по умолчанию для типа i и в минимальном поле.
Запишем: >> i >> j >> s;
где i, j, s описаны соответственно как int, float, char. В записи мы не видим форматов, но при вводе значений этих переменных с клавиатуры (после ввода каждого значения надо нажимать клавишу ) их форматы будут учтены.
. Объект cout
Объект cout направляет данные в буфер-поток,
связанный с объектом stdout,
объявленным в файле stdio.h. По умолчанию стандартные потоки С и
С++ синхронизированы. При выводе данные могут быть отформатированы с помощью
функций-членов класса или манипуляторов. Перечень их приведен в таблице 1.
Таблица 1.
|
Манипуляторы |
Функции-члены класса |
Описание |
||
|
showpos |
setf(ios::showpos) |
Выдает знак плюс у выводимых положительных чисел |
||
|
noshowpos |
unsetf(ios::showpos) |
- |
||
|
showbase |
setf(ios::showbase) |
Выдает базу системы счисления в выводимом числе в виде префикса |
||
|
noshowbase |
unsetf(ios::showbase) |
- |
||
|
uppercase |
setf(ios::uppercase) |
Заменяет символы нижнего регистра на символы верхнего регистра в выходном потоке |
||
|
nouppercase |
unsetf(ios::uppercase) |
- |
||
|
showpoint |
setf(ios::showpoint) |
Создает символ десятичной точки в сгенерированном потоке с плавающей точкой (в выводимом числе) |
||
|
noshowpoint |
unsetf(ios::showpoint) |
- |
setf(ios::boolalpha) |
Переводит булевый тип в символьный |
|
noboolalpha |
unsetf(ios::boolalpha) |
- |
||
|
unitbuf |
setf(ios::unitbuf) |
Сбрасывает буфер вывода после каждой операции вывода |
||
|
nounitbuf |
unsetf(ios::unitbuf) |
- |
||
|
internal |
setf(ios::internal, ios::adjustfield) |
Добавляет символы-заполнители к определенным внутренним позициям выходного потока (речь идет о выводе числа в виде потока символов). Если такие позиции не определены, поток не изменяется |
||
|
left |
setf(ios::left, ios::adjustfield) |
Добавляет символы-заполнители с конца числа (сдвигая число влево) |
||
|
right |
setf(ios::right, ios::adjustfield) |
Добавляет символы-заполнители с начала числа (сдвигая число вправо) |
||
|
dec |
setf(ios::dec, ios::basefield) |
Переводит базу вводимых или выводимых целых чисел в десятичную (введенные после этого манипулятора данные будут выводиться как десятичные) |
||
|
hex |
setf(ios::hex, ios::basefield) |
Переводит базу вводимых или выводимых целых чисел в шестнадцатеричную (введенные после этого манипулятора данные будут выводиться как шестнадцатеричные) |
||
|
oct |
setf(ios::oct, ios::basefield) |
Переводит базу вводимых или выводимых целых чисел в восьмеричную (введенные после этого манипулятора данные будут выводиться как восьмеричные) |
||
|
fixed |
setf(ios::fixed, ios::floatfield) |
Переводит выход с плавающей точкой в выход с фиксированной точкой |
||
|
scientific |
setf(ios::scientific, ios::floatfield) |
Выдает числа с плавающей точкой в виде, используемом в научных целях: например, число 23450000 будет записано как: 23.45e6 |
||
|
fill(c) |
setfill(char_type c) |
Задает символ заполнения при выводе данных |
||
|
precision(n) |
setprecision(int n) |
Задает точность вывода данных (количество цифр после точки) |
||
|
setw(int n) |
width(n) |
Задает ширину поля для выводимых данных (количество символов) |
||
|
endl |
|
Вставляет символ новой строки ('\n') в выходную последовательность символов и сбрасывает буфер ввода |
||
|
ends |
|
Вставляет символ '\0' в выходную последовательность символов |
||
|
flush |
flush() |
Сбрасывает буфер вывода |
||
|
ws |
|
Задает пропуск пробелов при вводе |
Пример программы с применением объекта cout приведен на листинге 5. Результат работы представлен на рисунке 2.
Листинг 5.
#include <vcl.h>
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <stdio.h>main()
{namespace std;i;f;<< "Enter i and f >" << endl;>> i >> f;<< i << endl;<< f << endl;<< hex << i << endl;<< oct << i << dec << i << endl;<< showpos << i << endl;<< setbase(16) << i << endl;<< setfill('@') << setw(20) << left << dec << i;<< endl;.fill('@');.width(20);.setf(ios::left, ios::adjustfield);.setf(ios::dec, ios::basefield);<< i << endl;<< scientific << setprecision(10) << f << endl;.precision(6);<< f << fixed << endl;();
}
Рисунок 2.
2. Стандартный ввод cin
Объект (экземпляр класса) cin управляет вводом из буфера ввода, связанного с объектом stdin, объявленным в файле stdio.h. По умолчанию стандартные потоки в языках С и С++ синхронизированы. При вводе используется часть тех функций и манипуляторов, которые определены для cout. Это такие манипуляторы, как dec, hex, oct, ws и др.
Пример программы с использованием объекта cin приведен в листинге 6. Результат работы представлен на рисунке 3.
Листинг 6.
#include <vcl.h>
#include <iostream>
#include <iomanip>
#include <stdio.h>main()
{namespace std;i;f;c;<< "Enter i,f,c and then input the string >" << endl;>> i >> f >> c;<< i << endl << f << endl << c << endl;p[50];>> ws >> p;<< p << endl;.seekg(0);.getline(p,50);<< p << endl;();
}
Рисунок 3.
Специалисты C++ рекомендуют использовать для ввода-вывода только потоки STL и отказаться от использования традиционного ввода-вывода в духе C. Однако, ничего не мешает, по крайней мере пока, использовать традиционную систему ввода-вывода. Более того, предусмотрена специальная функция для синхронизации ввода-вывода, выполненного посредством потоков и посредством старых функций.
Какой механизм использовать - вопрос предпочтений программиста, если
работодателем явно не предписано использование конкретного механизма. В любом
случае для физического ввода-вывода используются вызовы операционной системы.
Всё остальное - обёртка, набор более или менее удобных функций или классов для
взаимодействия с ОС.
1. Ахо Альфред В., Хопкрофт В., Ульман Джеффри Д. Структуры данных и алгоритмы - М.: Вильямс, 2016.
. Кортмен Т.Х Алгоритмы: построение и анализ - М.: Вильямс, 2013
. Миков А. И., Королев Л.Н., Информатика. Введение в компьютерные науки. - Абрис, Высшая школа, 2012.
. Мейерс С. Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ: Пер. с англ. - 3-е изд. - М.: ДМК пресс, 2006.
. Страуструп Б. Язык программирования C++: Пер. с англ. - 3-е спец. изд. - М.: Бином, 2003.
. Джосьютис Н. М. C++. Стандартная библиотека. Для профессионалов: Пер. с англ. - СПб.: Питер, 2004.
. Керниган Б. В., Ритчи Д. М. Язык программирования Си: Пер. с англ. - 3-е изд. - СПб.: Невский Диалект, 2001.