Я боролся с этим последние несколько часов, но мне нужна помощь в форматировании некоторых результатов. В принципе, у меня есть двумерный массив arr
который я хочу напечатать в 3 х 70 группах, т.е.
aaaaaa ... a //Columns 1-70
bbbbbb ... b //Columns 1-70
cccccc ... c //Columns 1-70
//newline
//newline
//newline
aaaaaa ... a //Columns 1-70
bbbbbb ... b //Columns 1-70
cccccc ... c //Columns 1-70
//and so on like that until all of top, mid, and bot is printed out
где aaaa....a
соответствует arr[0]
, bbbbb....b
соответствует arr[1]
, а cccc...c
соответствует arr[2]
.
Другая часть состоит в том, что arr
соответствует трем одномерным массивам top
, mid
и bot
. Как вы можете догадаться, aaaa...aaa
- значения в top
, bbbb...bbb
- значения в mid
, а ccc....ccc
- значения в bot
. Длина top
, mid
и bot
одинакова, поэтому одна length
поля была присвоена этому значению.
Мой текущий код (исключая импорт):
string alignToString;
stringstream out;
char arr[3][70];
for (int column = 1; column <= length; ++column)
{
out << top[column - 1];
if (column % 70 == 0)
{
out << endl;
for (int column = 1; column < 70; ++column)
{
}
}
arr[0][column] = top[column - 1];
arr[1][column] = mid[column - 1];
arr[2][column] = bot[column - 1];
if (column % 70 == 0)
{
break;
}
//TODO: output out.str();
}
Очевидно, этот код не работает. У меня была идея, что, может быть, я могу вывести каждый столбец из трех групп, а после столбца% 70 = 0, я бы добавил новые строки, но я не могу понять, что это так. Если кто-то может помочь мне решить эту проблему или обеспечить лучшее решение этой проблемы, я был бы очень признателен. Заранее спасибо.
Вопрос немного неясен - для чего используется arr
? Вы действительно хотите скопировать каждую строку top
, в mid
и bot
в arr
для последующего использования, а также для печати? Или это просто часть вашего решения? Если вам это не нужно для других целей, тогда нет никакой пользы при копировании данных из трех массивов с вашими данными в эти временные буферы.
Другой бит, который не является очевидным, - это то, хотите ли вы в представлении строки памяти или на самом деле печатать непосредственно в cout
. Если последнее, то опять нет никакой реальной выгоды при временном письме в буфер stringstream
заранее - символы будут записываться в том же порядке в любом случае.
Я предположил, что вы намереваетесь и то, и другое, но если не решение может быть сделано, чтобы работать быстрее. Говоря о скорости, хотя компиляторы улучшают оптимизацию, рабочий характер по характеру может быть очень медленным. Использование std :: ostream :: write() для получения длинных прогонов символов за раз более ясное и быстрое.
const size_t maxColumn = 70;
char arr[3][maxColumn];
using CharIteratorPair = std::pair<char *, char *>;
CharIteratorPair myArrays[] = {
{ top, arr[0] },
{ mid, arr[1] },
{ bot, arr[2] }};
std::stringstream out;
for (size_t i = 0 ; i < length; i += maxColumn) {
size_t gulpSize = std::min(maxColumn, length - i);
for (auto& source: myArrays) {
out.write(source.first, gulpSize);
out << std::endl;
// Remove this line if you don't need to copy the data
// into "arr"
std::copy_n(source.first, gulpSize, source.second);
std::advance(source.first, gulpSize);
}
// "arr" has now been filled in, do other processing here for each
// group of three rows as needed
}
// out has now been filled in, ready for extracting with .str()
// or printing to std::cout etc.
std::cout << out.str();