Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

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

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

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

Добавлен: 13.12.2020

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

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

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

Глава 40. Потоки ввода/вывода в C++ 

491 

Каждая из этих функций 

get

 возвращает значение 

*this

Для  неформатированного  ввода  из  потока  последовательности 
символов  (байтов)  в  шаблоне 

basic_ostream<E, T>

  также  пере-

гружены следующие функции 

get

:

 

  basic_istream& get(basic_streambuf<char_type, T> *sb); 
  basic_istream& get(basic_streambuf<E, T> *sb, 
      char_type delim); 

Обе эти перегруженные функции 

get

 вводят символы из текуще-

го потока и записывают их последовательно в буфер, адрес кото-
рого задан параметром 

sb

При  этом  первая  функция 

get

  вводит  из  потока  символы  до  тех 

пор, пока не выполнится одно из следующих условий: 

 

встретился конец файла; 

 

встретился символ перехода на новую строку 

\n

 

ввод символа в буфер закончился неудачей; 

 

при вводе символа в буфер произошло исключение. 

Вторая функция 

get

 работает  аналогично  первой, но  символ,  от-

мечающий конец ввода, задается параметром 

delim

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

get

 возвращает значение 

*this

Все  перегруженные  функции 

get

 

вызывают  функцию 

setstate(failbit)

, если не было введено ни одного символа. 

Пример  использования  функций 

put

  и 

get

  приведен  в  листин-

ге 40.5. 

Листинг 40.5. Пример использования функций 

put

 

и 

get

 

#include <iostream> 
#include <fstream> 
using namespace std; 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

492 

int main() 

  fstream demo("test.txt"); 
  char buf[80]; 

  demo << "aaa" << endl; 
  demo << "bbb"; 
  demo.put('x'); 

  demo.seekg(0);      // устанавливаем начало файла 
  demo.get(buf, 80); 
  cout << buf << (char)demo.get();  // aaa'\n' 

  demo.get(buf, 80, 'x'); 
  demo.get(buf[0]); 
  cout << buf << endl;              // xbb'\n' 

  demo.close(); 

  return 0; 

40.4.1.6. Ввод строки 

Для  неформатированного  ввода  из  потока  последовательности 
символов  (байт)  в  шаблоне 

basic_ostream<E, T>

  перегружены 

следующие функции 

getline

:

 

  basic_istream& getline(char_type *s, streamsize n); 
  basic_istream& getline(char_type *s, streamsize n, 
      char_type delim); 

Обе перегруженные функции 

getline

 вводят символы из текуще-

го потока и записывают их последовательно в массив, адрес ко-
торого задан параметром 

s

При  этом  первая  функция 

getline

  вводит  из  потока  символы  до 

тех пор, пока не выполнится одно из следующих условий: 

 

встретился конец файла; 

 

встретился символ перехода на новую строку 

\n

 

введено 

n-1

 символов. 


background image

Глава 40. Потоки ввода/вывода в C++ 

493 

Вторая функция 

getline

 работает аналогично первой, но символ, 

отмечающий конец ввода, задается параметром 

delim

Обе функции удаляют из потока символ, отмечающий конец вво-

да,  и  после  встречи  этого  символа  записывают  в  конец  массива 
символ 

char_type()

, т. е. конец строки. 

Каждая из функций 

getline

 возвращает значение 

*this

Пример  использования  функции 

getline

  приведен  в  листин-

ге 40.6. 

Листинг 40.6. Пример использования функции 

getline

 

#include <iostream> 
#include <fstream> 
using namespace std; 

int main() 

  fstream demo("test.txt"); 
  char buf[80]; 

  demo << "aaa aaa" << endl; 
  demo << "bbb bbb"; 
  demo.put('x'); 

  demo.seekg(0);  // устанавливаем начало файла 
  demo.getline(buf, 80); 
  cout << buf << endl;  // aaa aaa 
  demo.getline(buf, 80, 'x'); 
  cout << buf << endl;  // bbb bbb 

  demo.close(); 

  return 0; 

40.4.1.7. Просмотр символа в потоке 

В шаблоне класса 

basic_ostream<E, T>

 определена функция 

peek

которая читает символ из буфера потока, но не удаляет его

:

 

  int_type peek(); 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

494 

Функция возвращает прочитанный элемент буфера. Если в буфе-
ре  потока  нет  элементов,  то  функция 

peek

  возвращает  значение 

traits_type::eof()

В листинге 40.7 приведен пример использования функции 

peek

Листинг 40.7. Пример использования функции 

peek

 

#include <iostream> 
using namespace std; 

int main() 

  char c; 
  int n; 

  cout << "Press a key: "; 
  c = cin.peek(); 

  if (c >= '0' && c <= '9') 
  { 
    cin >> n; 
    cout << "It is a digit: " << n << endl; 
  } 
  else 
  { 
    cin >> c; 
    cout << "It is not a digit: " << c << endl; 
  } 
  return 0; 

40.4.1.8. Возврат символа в буфер потока ввода 

Для  возврата  в  буфер  потока  символа  в  шаблоне  класса 

basic_ostream<E, T>

 

определены функции 

unget

 и 

putback

  basic_istream& unget(); 
  basic_istream& putback(char_type c); 

Функция 

unget

 возвращает в поток последний прочитанный сим-

вол посредством вызова функции 

rdbuf()->sungetc()

. Если вызов 


background image

Глава 40. Потоки ввода/вывода в C++ 

495 

функции 

rdbuf()

  возвращает  пустой  указатель  или  вызов  функ-

ции 

sungetc()

  возвращает  значение 

traits_type::eof()

, то функ-

ция 

unget

 вызывает функцию 

setstate(badbit)

Функция 

putback

 возвращает в поток символ, заданный парамет-

ром 

c

,  посредством  вызова  функции 

rdbuf()->sputbackc()

.  Если 

вызов  функции 

rdbuf()

  возвращает  пустой  указатель  или  вызов 

функции 

sputbackc()

 возвращает значение 

traits_type::eof()

, то 

функция 

unget

 вызывает функцию 

setstate(badbit)

В  любом  случае  функции 

unget

  и 

putback

  возвращают  значение 

*this

В листинге 40.8 приведен пример использования функций 

unget

 и 

putback

Листинг 40.8. Пример использования функций 

unget

 

и 

putback

 

#include <iostream> 
using namespace std; 
 
int main() 

  char c; 
 
  cout << "Press ane key: "; 
  cin.get(c); 
  cout << c << endl; 
 
  cin.unget(); 
  cin.get(c); 
  cout << c << endl;  // печатает введенный символ 
 
  cin.putback('x'); 
  cin.get(c); 
  cout << c << endl;  // печатает: x 
 
  return 0; 


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