ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4232
Скачиваний: 28
Глава 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;
Часть 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
символов.
Глава 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();
Часть 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()
. Если вызов
Глава 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;
}