// для сохранения содержимого файла следует явно задать режим app

ofstream app("file2", ofstream::app); // out установлен неявно

ofstream app2("file2", ofstream::out | ofstream::app);

Единственный способ сохранить существующие данные в файле, открытом потоком типа ofstream, — это явно установить режим app или in.

Режим файла устанавливается при каждом вызове функции open()

Режим файла некоего потока может изменяться при каждом открытии файла.

ofstream out; // режим файла не установлен

out.open("scratchpad"); // неявно заданы режимы out и trunc

out.close(); // out закрыт, его можно использовать для другого файла

out.open("precious", ofstream::app); // режимы out и app

out.close();

Первый вызов функции open() не задает режим вывода явно; этот файл неявно открывается в режиме out. Как обычно, режим out подразумевает также режим trunc. Поэтому файл scratchpad, расположенный в текущем каталоге, будет усечен. Когда открывается файл precious, задается режим добавления. Все данные остаются в файле, а запись осуществляется в конец файла.

Режим файла устанавливается при каждом вызове функции open() явно или неявно. Когда режим не устанавливается явно, используется значение по умолчанию.

Упражнения раздела 8.2.2

Упражнение 8.7. Пересмотрите программу книжного магазина из предыдущего раздела так, чтобы вывод записывался в файл. Передайте имя этого файла как второй аргумент функции main().

Упражнение 8.8. Пересмотрите программу из предыдущего упражнения так, чтобы добавить ее вывод в заданный файл. Запустите программу для того же выходного файла по крайней мере дважды и удостоверьтесь, что данные сохраняются.

<p>8.3. Строковые потоки</p>

Заголовок sstream определяет три типа, поддерживающие операции ввода-вывода в оперативной памяти; эти типы обеспечивают чтение или запись в строку, как будто она является потоком ввода-вывода.

Объект класса istringstream читает строку, объект класса ostringstream записывает строку, а объект класса stringstream читает и записывает строку. Подобно типам заголовка fstream, типы, определенные в заголовке sstream, происходят от типов, используемых заголовком iostream. Кроме унаследованных операций, типы, определенные в заголовке sstream, имеют дополнительные члены для работы со строками, связанными с потоком. Эти операции перечислены в табл. 8.5. Они могут быть выбраны для объектов класса stringstream, строковых потоков (string stream), но не других типов ввода-вывода.

Обратите внимание на то, что хотя заголовки fstream и sstream имеют общий интерфейс к заголовку iostream, никакой другой взаимосвязи у них нет. В частности, нельзя использовать функции open() и close() для объектов класса stringstream, а функцию str() нельзя использовать для объектов класса fstream.

Таблица 8.5. Операции, специфические для класса stringstream

sstream strm;strm — несвязанный объект класса stringstream. sstream — это один из типов, определенных в заголовке sstream
sstream strm(s);sstream содержит копию строки s. Этот конструктор является явным (см. раздел 7.5.4).
strm.str()Возвращает копию строки, которую хранит объект strm
strm.str(s)Копирует строку s в объект strm. Возвращает тип void
<p>8.3.1. Использование класса <code>istringstream</code></p>

Класс istringstream зачастую используют тогда, когда некую работу следует выполнить со всей строкой и другую работу с отдельными словами в пределах строки.

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

morgan 2015552368 8625550123

drew 9735550130

lee 6095550132 2015550175 8005550000

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

Перейти на страницу:

Похожие книги