Некоторое время назад я искал фрагмент, чтобы сделать перенос по словам для определенного размера длины строки, не разбивая слова. Он работал достаточно честно, но теперь, когда я начал использовать его в режиме редактирования, я заметил, что он съедает несколько символов пробела между ними. Я обдумываю, как это исправить или полностью избавиться от него, если wstringstream не подходит для этой задачи. Может, у кого-то там есть подобная функция?
void WordWrap2(const std::wstring& inputString, std::vector<std::wstring>& outputString, unsigned int lineLength)
{
std::wstringstream iss(inputString);
std::wstring line;
std::wstring word;
while(iss >> word)
{
if (line.length() + word.length() > lineLength)
{
outputString.push_back(line+_T("\r"));
line.clear();
}
if( !word.empty() ) {
if( line.empty() ) line += word; else line += +L" " + word;
}
}
if (!line.empty())
{
outputString.push_back(line+_T("\r"));
}
}
Символ разделителя строк переноса должен остаться \r
Вместо того, чтобы читать слово за раз и добавлять слова до тех пор, пока вы не превысите желаемую длину строки, я начну с точки, где вы хотите выполнить перенос, и вернитесь назад, пока не найдете символ пробела, а затем добавьте это Весь кусок на выходе.
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
void WordWrap2(const std::wstring& inputString,
std::vector<std::wstring>& outputString,
unsigned int lineLength) {
size_t last_pos = 0;
size_t pos;
for (pos=lineLength; pos < inputString.length(); pos += lineLength) {
while (pos > last_pos && !isspace((unsigned char)inputString[pos]))
--pos;
outputString.push_back(inputString.substr(last_pos, pos-last_pos));
last_pos = pos;
while (isspace((unsigned char)inputString[last_pos]))
++last_pos;
}
outputString.push_back(inputString.substr(last_pos));
}
В нынешнем виде это не удастся, если он встретит одно слово, которое длиннее указанной вами длины строки (в таком случае, возможно, должен просто перерыв в середине слова, но в настоящее время это не так).
Я также написал это, чтобы пропустить пробел между словами когда они случаются при разрыве строки. Если вы действительно этого не хотите, просто удалите:
while (isspace((unsigned char)inputString[last_pos]))
++last_pos;
Если вы не хотите терять пробелы, вам нужно добавить следующую строку перед выполнением любых операций чтения:
iss >> std::noskipws;
Но потом с помощью >>
со строкой в качестве второго аргумента не будет хорошо работать с w.r.t. пространства.
Вам придется прибегнуть к чтению символов и самостоятельно управлять ими.