Я работаю над файлом C ++ и столкнулся с интересной проблемой.
Я выводить строки в текстовый файл (с использованием ofstream), и у меня есть следующие строки.
void InstructionWriter::outputLabel(string s){
string sLabel;
sLabel = s;
sLabel.erase(remove(sLabel.begin(), sLabel.end(), ' '),sLabel.end());
sLabel = "(" + function + "$" + sLabel + ")\n" ;
outputFile << sLabel;
}
Проблема в том, что во время вывода TXT-файла.
Когда я направляюсь к текстовому файлу, в котором был запущен outputLabel, выделение строки подсчитывает символы +1 символа. что +1 «невидим». Выделение строки не выберет ее. Единственный способ исправить это — начать удаление справа. После того, как вы нажмете «)», я замечу, что снова нажал «Удалить», но курсор не двигался, и кажется, что ничего не было удалено.
Я думаю, что это скрытый символ нулевой ширины, но я не знаю, как вычеркнуть это из строки, у кого-нибудь есть какие-нибудь идеи по поводу того, на какие функции смотреть?
@ smac89
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_M_replace
0
Это то, что терминал бросил в меня после выполнения команды, которую вы упомянули.
Все, я был в состоянии понять это.
согласно комментарию Smacs, я загрузил выходной текстовый файл в бинарный редактор. как ни странно, я нашел 0D перед символом новой строки, который я вставил вручную.
Я использовал замену регулярного выражения в строке, и теперь он не добавляет этот символ 0D в строку.
Спасибо за все советы.
Вместо sLabel.erase(remove(sLabel.begin(), sLabel.end(), ' '),sLabel.end());
пожалуйста попробуйте это:
std::string from = " ", to = "";
size_t start_pos = 0;
while ((start_pos = sLabel.find(from, start_pos)) != std::string::npos) {
sLabel.replace(start_pos, from.length(), to);
start_pos += to.length();
}
Потому что строка в кодировке UTF-8; и вы не можете полагаться на отдельные байты. Манипулировать только подстроки.