ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4227
Скачиваний: 28
Часть IV. Стандартная библиотека языка программирования С++
496
40.4.1.9. Ввод блока памяти
Для неформатированного ввода из потока последовательности
байтов в память в шаблоне класса
basic_istream<E, T>
определе-
ны функции
read
и
readsome
:
basic_istream& read(char_type *s, streamsize n);
streamsize readsome(char_type *s, streamsize n);
Функция
read
читает данные из текущего потока и последова-
тельно записывает их в массив, адрес которого задан парамет-
ром
s
. Параметр
n
задает количество элементов, которые будут
прочитаны из потока. Заметим, что при вводе данные не форма-
тируются, т. е. в блок памяти записываются копии байтов, прочи-
танных из потока.
Если при вводе из потока встретился конец файла, то ввод закан-
чивается и функция вызывает функцию
setstate(failbit)
.
Функция
read
возвращает значение
*this
.
Функция
readsome
работает следующим образом. Сначала она
определяет, сколько символов (байтов) хранится в буфере потока,
а затем читает эти данные из буфера потока в массив, адрес кото-
рого задан параметром
s
. Количество прочитанных элементов
равно наименьшему из значений, заданных параметром
n
и рав-
ным количеству элементов в буфере. Как и в случае с функцией
read
, данные при вводе не форматируются, т. е. в блок памяти
записываются копии байтов, прочитанных из потока.
Если при определении количества элементов в буфере потока
функция
rdbuf()->in_avail()
вернет отрицательное значение, то
функция
readsome
вызывает функцию
setstate(eofbit)
.
В любом случае функция
readsome
возвращает количество прочи-
танных элементов.
40.4.1.10. Игнорирование символов
В шаблоне класса
basic_istream<E, T>
определена функция:
basic_istream& ignore(streamsize n = 1,
int_type delim = traits_type::eof());
Глава 40. Потоки ввода/вывода в C++
497
Она удаляет из текущего потока символы до тех пор, пока не вы-
полнится одно из следующих условий:
из потока удалено
n
символов;
в потоке встретился символ, заданный параметром
delim
, ко-
торый также удаляется.
Функция
ignore
возвращает значение
*this
.
40.4.1.11. Определение количества
прочитанных символов
В шаблоне класса
basic_istream<E, T>
определена функция
gcount
, которая возвращает количество символов, прочитанных
последней функцией неформатного ввода:
streamsize gcount() const;
Пример использования функции
gcount
приведен в листинге 40.9.
Листинг 40.9. Пример использования функции
gcount
#include <iostream>
using namespace std;
int main()
{
char line[80];
cout << "Input a string: ";
cin.getline(line, 80);
cout << "String length = " << cin.gcount() - 1 << endl;
return 0;
}
40.4.1.12. Управление индикатором позиции
Для управления индикатором позиции в шаблоне класса
basic_istream<E, T>
определены следующие функции:
Часть IV. Стандартная библиотека языка программирования С++
498
pos_type tellg();
basic_istream& seekg(pos_type pos);
basic_istream& seekg(off_type off, ios_base::seek_dir dir);
Функция
tellg
читает, а функции
seekg
устанавливают значение
индикатора позиции потока для дальнейшего чтения данных из
потока функциями неформатного ввода.
Функция
tellg
работает следующим образом. Сначала вызывает-
ся функция
fail()
. Если эта функция вернула значение
false
, то
функция
tellg
возвращает значение
rdbuf()-> pubseekoff(0,
cur, in)
, иначе — значение
pos_type(-1)
.
Функции
seekg
работают следующим образом. Сначала вы-
зывается функция
fail()
. Если эта функция вернула зна-
чение
false
, то первая функция
seekg
вызывает функцию
rdbuf()->pubseekpos(pos)
, а вторая — функцию
rdbuf()->
pubseekoff(off, dir)
. Обе функции
seekp
возвращают значение
*this
.
Пример работы функций
tellg
и
seekg
приведен в листинге 40.10.
Листинг 40.10. Пример работы функций
tellg
и
seekg
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
char c;
fstream::pos_type i;
fstream demo("test.txt");
demo << "---";
i = demo.tellg(); // запоминаем индикатор позиции
demo << 'x' << "---" << flush;
demo.seekg(i); // устанавливаем индикатор позиции
c = demo.get();
cout << c << endl; // печатает: x
return 0;
}
Глава 40. Потоки ввода/вывода в C++
499
40.4.1.13. Синхронизация потока с файлом
В общем случае под
синхронизацией потока с файлом
понимает-
ся приведение файла в такое состояние, которое бы он имел при
отсутствии буферизации ввода/вывода.
Для синхронизации потока ввода в шаблоне класса
basic_
istream<E, T>
определена функция:
int sync();
Функция
sync
работает аналогично функции
flush
, определенной
в шаблоне класса
basic_istream<E, T>
и рассмотренной в
разд. 4.3.1.8
.
40.4.1.14. Класс
sentry
В шаблоне класса
basic_istream<E, T>
определен вложенный
класс
sentry
:
class sentry
{
public:
explicit sentry(basic_istream& is, bool noskip = false);
operator bool() const;
};
Класс
sentry
служит для объявления объектов, создание которых
подготавливает поток, заданный параметром
is
конструктора,
для форматированного и неформатированного ввода. После за-
вершения работы конструктора вызов оператора преобразования
типа
bool
возвращает значение
true
, если значение
is.good()
также равно
true
, иначе — значение
false
.
40.4.2. Манипулятор
В заголовочном файле istream определен следующий шаблон ма-
нипулятора шаблонного класса
basic_istream<E, T>
:
template class<E, T>
basic_istream<E, T>& ws(basic_istream<E, T>& is);
Часть IV. Стандартная библиотека языка программирования С++
500
Манипулятор
ws
удаляет из потока ввода, заданного парамет-
ром
is
, все ведущие пробельные символы. Удаление символов
прекращается при встрече первого не пробельного символа или
при достижении конца файла. В последнем случае манипулятор
вызывает функцию
setstate(eofbit)
.
40.4.3. Перегруженный шаблон
оператора ввода
>>
Для форматированного ввода символа в заголовочном файле
istream перегружены следующие шаблоны оператора
>>
:
template<class E, class T> basic_istream<E, T>&
operator>>(basic_istream<E, T>& is, E& c);
template<class T> basic_istream<char, T>&
operator>>(basic_istream<char, T>& is, signed char& c);
template<class T> basic_istream<char, T>&
operator>>(basic_istream<char, T>& is, unsigned char& c);
Соответствующие шаблонные операторы
>>
вводят из потока,
заданного параметром
is
, символ, который записывают по адре-
су, заданному параметром
c
.
Для форматированного ввода последовательности символов в
заголовочном файле istream перегружены следующие шаблоны
оператора
>>
:
template<class E, class T> basic_istream<E, T>&
operator>>(basic_istream<E, T>& is, E *s);
template<class T> basic_istream<char, T>&
operator>>(basic_istream<char, T>& is, signed char *s);
template<class T> basic_istream<char, T>&
operator>>(basic_istream<char, T>& is, unsigned char *s);
Соответствующие шаблонные операторы
>>
вводят из потока,
заданного параметром
is
, символы и последовательно записыва-
ют их в массив, адрес которого задан параметром
s
.
При вводе все ведущие пробельные символы игнорируются. Ввод
символов заканчивается при выполнении одного из следующих
требований: