8.3.2. Использование класса ostringstream
Класс ostringstream полезен тогда, когда необходимо организовать вывод небольшими частями за раз, не откладывая его на более позднее время. Например, могла бы возникнуть необходимость проверять и переформатировать номера телефонов, которые были прочитаны в коде предыдущего примера. Если все номера допустимы, необходимо переформатировать номера и вывести их в новый файл. Если у кого-нибудь будут недопустимые номера, то помещать их в новый файл не нужно. Вместо этого следует вывести сообщение об ошибке, содержащее имя человека и список его недопустимых номеров.
Поскольку нельзя включать для человека данные с недопустимыми номерами, мы не можем произвести вывод, пока не просмотрим и не проверим все их номера. Но можно "записать" вывод в оперативную память объекта класса ostringstream:
for (const auto &entry : people) { // для каждой записи в people
ostringstream formatted, badNums; // объекты создаются на каждом
// цикле
for (const auto &nums : entry.phones) { // для каждого номера
if (!valid(nums)) {
badNums << " " << nums; // строка в badNums
} else
// "запись" в строку formatted
formatted << " " << format(nums);
}
if (badNums.str().empty()) // если плохих номеров нет
os << entry.name << " " // вывести имя
<< formatted.str() << endl; // и переформатированные номера
else // в противном случае вывести имя и плохие номера
cerr << "input error: " << entry.name
<< " invalid number(s) " << badNums.str() << endl;
}
В этой программе подразумевается, что есть две функции, valid() и format(), которые проверяют и переформатируют номера телефонов. Интересная часть программы — использование строковых потоков formatted и badNums. Для записи в эти объекты используется обычный оператор вывода (<<). Но они действительно "пишут" строковые манипуляторы. Они добавляют символы к строкам в строковых потоках formatted и badNums соответственно.
Упражнения раздела 8.3.2
Упражнение 8.13. Перепишите программу номеров телефонов из этого раздела так, чтобы читать из именованного файла, а не из объекта cin.
Упражнение 8.14. Почему переменные entry и nums были объявлены как const auto &?
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОК