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 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением

ПОЛУЧИТЬ ПОДАРОК