Выбрать главу

#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() );

// выводим отсортированное множество слов в файл

vectorstring ::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

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

magical mean, more. no red same says she

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 используется для форматирования сообщения об ошибке, которое возвращается вызывающей программе.

#include sstream

string program_name( "our_program" );

string version( 0.01 );

// ...

string mumble( int *array, int size )

{

if ( ! array ) {

ostringstream out_message;

out_message "ошибка: "

program_name "--" version

": " __FILE__ ": " __LINE__

" -- указатель равен 0; "

" а должен адресовать массив.\n";

// возвращаем строку, в которой находится сообщение

return out_message.str();

}

// ...

}

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

Потоки ввода/вывода поддерживают два предопределенных типа: char и wchar_t. В этой главе мы расскажем только о чтении и записи в потоки данных типа char. Помимо них, в библиотеке iostream имеется набор классов и объектов для работы с типом wchar_t. Они отличаются от соответствующих классов, использующих тип char, наличием префикса ‘w’. Так, объект стандартного ввода называется wcin, стандартного вывода – wcout, стандартного вывода для ошибок – wcerr. Но набор заголовочных файлов для char и wchar_t один и тот же.

Классы для ввода/вывода данных типа wchar_t называются wostream, wistream, wiostream, для файлового ввода/вывода – wofstream, wifstream, wfstream, а для строкового – wostringstream, wistringstream, wstringstream.

20.1. Оператор вывода

Оператор вывода обычно применяется для записи на стандартный вывод cout. Например, программа