Материал: Ввод и вывод в языке С++

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

%[*][ширина][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().

2. Ввод и вывод в языке С++


Ввод и вывод в С++ организован с помощью так называемых поточных классов, содержащих данные и методы работы с файлами по вводу/выводу. Поточные классы происходят от общего предка - класса 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();

2.1    Файловый ввод/вывод с использованием разных классов


Поточные классы - это поставщики инструментов для работы с файлами. В поточных классах хранятся:

-       структуры, обеспечивающие открытие/закрытие файлов;

-       функции (методы) открытия/закрытия файлов;

-       другие функции и данные, обеспечивающие собственно ввод/вывод.

При использовании поточных классов языка С++ в основной программе требуется писать директиву:

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();

2.2    Стандартный ввод/вывод в С++


Стандартный ввод/вывод является частным случаем файлового ввода/вывода. При файловом вводе/выводе мы объявляли экземпляры соответствующих поточных классов и затем пользовались методами и операциями << и >>. Но классы 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.