Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4087

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть 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()); 


background image

Глава 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>

 

определены следующие функции: 


background image

Часть 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; 


background image

Глава 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); 


background image

Часть 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

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


Смотрите также файлы