Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Потоки ввода-вывода.doc
Скачиваний:
0
Добавлен:
14.11.2019
Размер:
338.94 Кб
Скачать

Класс istream

Следующие функции являются элементами класса istream:

  • istream &ignore(long n = 1, int t = EOF) ; Эта функция позволяет пропустить при вводе ряд символов. Она извлекает из потока максимум n символов, пока среди них не встретится ограничитель t. Ограничитель также извлекается из потока.

  • long gcount() ; Функция возвращает число символов, извлеченных из потока последней функцией неформатированного ввода. (Если после нее выполнялись какие-либо форматные процедуры, это число может быть модифицировано.)

  • int peek () ; Функция возвращает следующий символ потока, не извлекая его. Возвращает EOF, если установлен какой-либо из флагов состояния потока.

  • istream Sputback (char с) ; Возвращает во входной поток последний извлеченный символ.

  • istream &seekg(long pos) , istream &seekg(long ofs, int dir) ;

Устанавливает положение указателя потока. Для первой формы указывается абсолютная, для второй — относительная позиция указателя. Параметр dir может принимать следующие значения:

  • ios : :beg смещение (ofs) от начала файла;

  • ios : : cur смещение от текущей позиции указателя;

  • ios : : end смещение от конца файла.

  • long tellg() ; Возвращает текущее положение указателя входного потока.

Класс ostream

Последним двум функциям из istream соответствуют аналогичные функции класса ostream:

  • ostream &seekp(long pos), ostream &seekp(long ofs, int dir) ; Аналогична see kg () . Выполняет абсолютное или относительное позиционирование выходного потока.

  • long tellp() ; Аналогична tellg() . Возвращает текущую позицию выходного потока.

Чтение символов и строк

Для чтения одиночных символов, а также строк применяется функция get класса istream. Эта функция перегружена следующим образом:

int get ();

istream &get(char &c);

istream &get(char *buf, long len, char t = '\n');

Две первые формы функции предназначены для извлечения из потока одиночного символа. Функция int get() возвращает символ в качестве своего значения. Функция get (char &c) передает символ в параметре и возвращает ссылку на свой поток.

Вот, например, как можно было бы выполнить посимвольное копирование файлов:

ifstream ifs("infile.dat");

ofstream ofs("outfile.dat");

while (ifs & ofs)

ofs.put(ifs.get());

// put (char) передает в поток

// одиночный символ.

Последняя форма функции get () извлекает из потока последовательность символов. Символы читаются в буфер buf, пока не произойдет одно из следующих событий:

  • будет встречен ограничивающий символ t (по умолчанию ' \n ');

  • будет встречен конец файла;

  • в буфер будет записано len символов, включая завершающий строку 0. Имеется еще функция getline(), во всем аналогичная этой форме

get (): istream Sgetline(char *buf, long len, char t = '\n');

Разница между этими двумя функциями состоит в том, что get line () извлекает из потока ограничивающий символ, в то время как get () этого не делает. Ни та, ни другая функция не записывает ограничивающий символ в буфер.

Пример использования getline () вы уже видели в листинге 4. Вот небольшой пример чтения строк с помощью get ():

#inciude <iostream.h>

int main(void) {

char name[9], ext[4];

cout << "Enter a filename with extension: ";

cin.get(name, 9, '.');

cin.ignore (80, '.'); // Удалить все оставшиеся

// до точки символы. cin.get(ext, 4) ;

cin.ignore(80, '\n'); // Удалить все, что осталось

// в строке.

cout<< "Name: "<< name << "; extension: " << ext << endl;

return 0;

}

Эта программа, как нетрудно догадаться, усекает произвольное имя файла до формата 8.3.