C ++ возврат каретки и перевод строки в строку

Я работаю со связью для некоторого оборудования, связанного с TCP / IP, в C ++.
Оборудование требует, чтобы отправленные команды заканчивались на \ r \ n.

Я использую файл конфигурации, из которого я читаю команды, используемые в сообщении.

У меня проблема в том, что команды \ r \ n интерпретируются как 4 символа, а не как возврат каретки и перевод строки.

Я пытался использовать string.data (), но я получаю тот же результат, что и string.c_str ().

Есть ли какая-нибудь хорошая функция, чтобы получить ее правильно с самого начала, или мне нужно решить эту проблему с помощью обычной функции замены? Или какой-то другой способ, о котором я не думал?

Я думаю, если я не найду действительно аккуратный способ сделать это, я просто опущу \ r \ n в файле конфигурации и добавлю его потом, но было бы хорошо, чтобы все это было в файле конфигурации без каких-либо трудностей. кодирование. Я думаю, что мне нужно было бы также выполнить некоторое жесткое кодирование, если бы я попытался заменить четыре символа \ r \ n их правильными символами.

Спасибо за любую помощь

Редактировать:
Файл конфигурации содержит строки, подобные этой.

MONITOR_REQUEST = «TVT? \ R \ n»

2

Решение

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

std::string
globalReplace(
std::string::const_iterator begin,
std::string::const_iterator end,
std::string const& before,
std::string const& after )
{
std::string retval;
std::back_insert_iterator<std::string> dest( retval );
std::string::const_iterator current = begin;
std::string::const_iterator next
= std::search( current, end, before.begin(), before.end() );
while ( next != end ) {
std::copy( current, next, dest );
std::copy( after.begin(), after.end(), dest );
current = next + before.size();
next = std::search( current, end, before.begin(), before.end() );
}
std::copy( current, next, dest );
return retval;
}

за это. Вы могли бы назвать это с "\\r\\n", "\r\n" для
последний к аргументам, например.

3

Другие решения

Похоже, ваш файл конфигурации на самом деле содержит 4 различных символа '\', 'r', '\', а также 'n'… вы должны либо изменить файл (например, используя фактические окончания строк в файле для кодирования концов строк в строках, и даже в этом случае некоторые системы не будут использовать \ r \ n в качестве разделителей строк в текстовом файле), или сделайте замену / перевод, как вы предлагаете. Перевод является более портативным подходом. Это также может быть довольно быстро … просто поддерживать два указателя / итератора / индекса в строке — один для позиции чтения и один для записи, а также копировать при сжатии escape-записи.

3

Вам не нужно ничего кодировать в коде.
Вы можете очень хорошо читать символы для добавления к исходящей строке из того же файла конфигурации.

Предполагая, что у вас есть пара имя-значение в вашем файле conf:

APPEND_EOL = «\ n \ r» str_to_send1 = «это тест %% APPEND_EOL %%»

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

1
По вопросам рекламы [email protected]