Удалить символ с потока 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 шт):
Можно не игнорировать, а обойти
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 ] (вместо запятых - пробелы + один пробел вначале). В таком варианте совсем нет условий. Просто вывод.
а вот игнорировать - тут сложнее - это же поток вывода. Он умеет только выводить. как мясорубка - если зашло, то все. Хотя никто не мешает написать свой поток вывода, который будет буферизировать один символ и позволять его подменять.
Лучший вариант выводить так, как нужно. Если за последним элементом форматирование изменяется, то последний элемент лучше выводить вне вложенного цикла, дабы избавиться от проверки условия в цикле:
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" ;
}
Но этот и все другие варианты будут рассмотрены для чисто спортивного интереса из за лишних операций и объектов.