Удалить символ с потока C++

Есть ли другие способы реализовать удаление (игнорирование) последнего символа в потоке ?

Вот мой код:

std::ostream& operator<< (std::ostream& stream, Matrix matrix)
{
    for (size_t i = 0; i < matrix.ROW; i++)
    {
        stream << "[";
        for (size_t j = 0; j < matrix.COL; j++)
        {
            stream << std::setw(2) << matrix.m[i][j];
            if (j != matrix.COL - 1) stream << ',';
        }
        stream << "]\n";
    }
    return stream;
}

Ответы (2 шт):

Автор решения: KoVadim

Можно не игнорировать, а обойти

std::ostream& operator<< (std::ostream& stream, Matrix matrix)
{
    for (size_t i = 0; i < matrix.ROW; i++)
    {
        stream << "[";
        if (matrix.m[i].size() > 0) {
          stream << std::setw(2) << matrix.m[i][0];
          for (size_t j = 1; j < matrix.COL; j++)
          {
              stream << ',' << std::setw(2) << matrix.m[i][j];
          }
        }
        stream << "]\n";
    }
    return stream;
}

А условие проверки на пустоту возможно можно и убрать или делать один раз - это зависит от внутренностей класса Matrix.

Второй способ, которым я решал эту же проблему - это вместо [1,2,3] выводить [ 1 2 3 ] (вместо запятых - пробелы + один пробел вначале). В таком варианте совсем нет условий. Просто вывод.

а вот игнорировать - тут сложнее - это же поток вывода. Он умеет только выводить. как мясорубка - если зашло, то все. Хотя никто не мешает написать свой поток вывода, который будет буферизировать один символ и позволять его подменять.

→ Ссылка
Автор решения: AR Hovsepyan

Лучший вариант выводить так, как нужно. Если за последним элементом форматирование изменяется, то последний элемент лучше выводить вне вложенного цикла, дабы избавиться от проверки условия в цикле:

 for (size_t i = 0; i <  matrix.ROW; i++)
{
    stream << "[";
    for (size_t j = 0; j <  matrix.COL - 1; j++)
    {
        stream << std::setw(2) 
               <<  matrix.m[i][j]   << ',';           
    }
    stream << std::setw(2) 
        <<  matrix.m[i][COL - 1]  << "]\n";         
} 

Есть и другие варианты. Например форматировать через строковой поток, а в целевой поток подать строковое представление введенного, предварительно удаляя последний символ:

std::ostringstream os ;
for (size_t i = 0; i < matrix.ROW; i++)
{
    os << "[";
    for (size_t j = 0; j < matrix.COL; j++)
    {
        os << std::setw(2) 
               << matrix.m[i][j]   << ',';           
    }        
    std::string str(os.str());
    str.pop_back();
    //возврат коретки, чтобы записать снова        
    os << '\r'; 
    stream << str << "]\n" ;         
}

Но этот и все другие варианты будут рассмотрены для чисто спортивного интереса из за лишних операций и объектов.

→ Ссылка