Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ для начинающих (Стенли Липпман) 3-е хххх.pdf
Скачиваний:
85
Добавлен:
30.05.2015
Размер:
5.92 Mб
Скачать

С++ для начинающих

1020

(a)void operate( double ); void operate( string );

void operate( const Base & ); Derived *pd = new Derived;

(b)void calc( int ); void calc( double );

void calc( const Derived & ); Base *pb = new Derived; operate( *pd );

operate( *pb );

20

20. Библиотека iostream

Частью стандартной библиотеки C++ является библиотека iostream объектно- ориентированная иерархия классов, где используется и множественное, и виртуальное наследование. В ней реализована поддержка для файлового ввода/вывода данных встроенных типов. Кроме того, разработчики классов могут расширять эту библиотеку для чтения и записи новых типов данных.

Для использования библиотеки iostream в программе необходимо включить заголовочный файл

#include <iostream>

Операции ввода/вывода выполняются с помощью классов istream (потоковый ввод) и ostream (потоковый вывод). Третий класс, iostream, является производным от них и поддерживает двунаправленный ввод/вывод. Для удобства в библиотеке определены три стандартных объекта-потока:

cin объект класса istream, соответствующий стандартному вводу. В общем случае он позволяет читать данные с терминала пользователя;

cout объект класса ostream, соответствующий стандартному выводу. В общем случае он позволяет выводить данные на терминал пользователя;

cerr объект класса ostream, соответствующий стандартному выводу для ошибок. В этот поток мы направляем сообщения об ошибках программы.

Вывод осуществляется, как правило, с помощью перегруженного оператора сдвига влево (<<), а ввод с помощью оператора сдвига вправо (>>):

С++ для начинающих

1021

#include <iostream> #include <string>

int main()

{

string in_string;

//вывести литерал на терминал пользователя cout << "Введите свое имя, пожалуйста: ";

//прочитать ответ пользователя в in_string cin >> in_string;

if ( in_string.empty() )

// вывести сообщение об ошибке на терминал пользователя cerr << "ошибка: введенная строка пуста!\n";

else cout << "Привет, " << in_string << "!\n";

}

Назначение операторов легче запомнить, если считать, что каждый указываетв сторону перемещения данных. Например,

>> x

перемещает данные в x, а

<< x

перемещает данные из x. (В разделе 20.1 мы покажем, как библиотека iostream поддерживает ввод данных, а в разделе 20.5 – как расширить ее для ввода данных новых типов. Аналогично раздел 20.2 посвящен поддержке вывода, а раздел 20.4 – расширению для вывода данных определенных пользователем типов.)

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

ifstream, производный от istream, связывает ввод программы с файлом;

ofstream, производный от ostream, связывает вывод программы с файлом;

fstream, производный от iostream, связывает как ввод, так и вывод программы с файлом.

Чтобы использовать часть библиотеки iostream, связанную с файловым вводом/выводом, необходимо включить в программу заголовочный файл

#include <fstream>

(Файл fstream уже включает iostream, так что включать оба файла необязательно.) Файловый ввод/вывод поддерживается теми же операторами:

С++ для начинающих

1022

#include <fstream> #include <string> #include <vector> #include <algorithm> int main()

{

string ifile;

cout << "Введите имя файла для сортировки: "; cin >> ifile;

// сконструировать объект класса ifstream для ввода из файла ifstream infile( ifile.c_str() );

if ( ! infile ) {

cerr << "ошибка: не могу открыть входной файл: " << ifile << endl;

return -1;

}

string ofile = ifile + ".sort";

// сконструировать объект класса ofstream для вывода в файл ofstream outfile( ofile.c_str() );

if ( ! outfile) {

cerr << "ошибка: не могу открыть выходной файл: " << ofile << endl;

return -2;

}

string buffer;

vector< string, allocator > text;

int cnt = 1;

while ( infile >> buffer ) { text.push_back( buffer );

cout << buffer << (cnt++ % 8 ? " " : "\n" );

}

sort( text.begin(), text.end() );

// выводим отсортированное множество слов в файл vector< string >::iterator iter = text.begin(); for ( cnt = 1; iter != text.end(); ++iter, ++cnt )

outfile << *iter

<< (cnt % 8 ? " " : "\n" );

return 0;

}

Вот пример сеанса работы с этой программой. Нас просят ввести файл для сортировки. Мы набираем alice_emma (набранные на клавиатуре символы напечатаны полужирным шрифтом). Затем программа направляет на стандартный вывод все, что прочитала из файла:

Введите имя файла для сортировки: alice_emma Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

tells her, magical but untamed. "Daddy, shush, there

С++ для начинающих

1023

is no such creature," she tells him, at the same time wanting him to tell her more. Shyly, she asks, "I mean, Daddy, is there?"

Далее программа выводит в файл outfile отсортированную последовательность строк. Конечно, на порядок слов влияют знаки препинания; в следующем разделе мы это исправим:

"Daddy, "I A Alice Daddy Daddy,

Emma Her

Shyly, a alive,

almost asks, at

beautiful bird

bird, blows but

creature,"

fiery fiery flight. flowing

hair, hair. has

he her her

her,

him

him, in is is it like long

looks

says she

magical mean, more. no red

same

she shush, such

tell tells

tells the the

there there?" through time

to untamed. wanting when

wind

 

 

 

(В разделе 20.6 мы познакомимся с файловым вводом/выводом более подробно.)

Библиотека iostream поддерживает также ввод/вывод в область памяти, при этом поток связывается со строкой в памяти программы. С помощью потоковых операторов ввода/вывода мы можем записывать данные в эту строку и читать их оттуда. Объект для строкового ввода/вывода определяется как экземпляр одного из следующих классов:

istringstream, производный от istream, читает из строки;

ostringstream, производный от ostream, пишет в строку;

stringstream, производный от iostream, выполняет как чтение, так и запись.

Для использования любого из этих классов в программу нужно включить заголовочный файл

#include <sstream>

(Файл sstream уже включает iostream, так что включать оба файла необязательно.) В

следующем фрагменте объект класса ostringstream используется для форматирования сообщения об ошибке, которое возвращается вызывающей программе.