//
ofstream app("file2", ofstream::app); //
ofstream app2("file2", ofstream::out | ofstream::app);
ofstream, — это явно установить режим app или in.
open()Режим файла некоего потока может изменяться при каждом открытии файла.
ofstream out; //
out.open("scratchpad"); //
out.close(); //
out.open("precious", ofstream::app); //
out.close();
Первый вызов функции open() не задает режим вывода явно; этот файл неявно открывается в режиме out. Как обычно, режим out подразумевает также режим trunc. Поэтому файл scratchpad, расположенный в текущем каталоге, будет усечен. Когда открывается файл precious, задается режим добавления. Все данные остаются в файле, а запись осуществляется в конец файла.
open() явно или неявно. Когда режим не устанавливается явно, используется значение по умолчанию.
Упражнение 8.7. Пересмотрите программу книжного магазина из предыдущего раздела так, чтобы вывод записывался в файл. Передайте имя этого файла как второй аргумент функции main().
Упражнение 8.8. Пересмотрите программу из предыдущего упражнения так, чтобы добавить ее вывод в заданный файл. Запустите программу для того же выходного файла по крайней мере дважды и удостоверьтесь, что данные сохраняются.
8.3. Строковые потоки
Заголовок sstream определяет три типа, поддерживающие операции ввода-вывода в оперативной памяти; эти типы обеспечивают чтение или запись в строку, как будто она является потоком ввода-вывода.
Объект класса istringstream читает строку, объект класса ostringstream записывает строку, а объект класса stringstream читает и записывает строку. Подобно типам заголовка fstream, типы, определенные в заголовке sstream, происходят от типов, используемых заголовком iostream. Кроме унаследованных операций, типы, определенные в заголовке sstream, имеют дополнительные члены для работы со строками, связанными с потоком. Эти операции перечислены в табл. 8.5. Они могут быть выбраны для объектов класса stringstream,
Обратите внимание на то, что хотя заголовки fstream и sstream имеют общий интерфейс к заголовку iostream, никакой другой взаимосвязи у них нет. В частности, нельзя использовать функции open() и close() для объектов класса stringstream, а функцию str() нельзя использовать для объектов класса fstream.
Таблица 8.5. Операции, специфические для класса stringstream
| strm — несвязанный объект класса stringstream. — это один из типов, определенных в заголовке sstream |
| содержит копию строки s. Этот конструктор является явным (см. раздел 7.5.4). |
strm.str() | Возвращает копию строки, которую хранит объект strm |
strm.str(s) | Копирует строку s в объект strm. Возвращает тип void |
8.3.1. Использование класса istringstream
Класс istringstream зачастую используют тогда, когда некую работу следует выполнить со всей строкой и другую работу с отдельными словами в пределах строки.
Предположим, например, что имеется файл, содержащий список людей и номеров их телефонов. У одних людей есть только один номер, а у других несколько — домашний телефон, рабочий, мобильный и т.д. Наш исходный файл может выглядеть следующим образом:
morgan 2015552368 8625550123
drew 9735550130
lee 6095550132 2015550175 8005550000
Каждая запись в этом файле начинается с имени, затем следует один или несколько номеров телефонов. Для начала определим простой класс, представляющий исходные данные: