Я работаю со связью для некоторого оборудования, связанного с TCP / IP, в C ++.
Оборудование требует, чтобы отправленные команды заканчивались на \ r \ n.
Я использую файл конфигурации, из которого я читаю команды, используемые в сообщении.
У меня проблема в том, что команды \ r \ n интерпретируются как 4 символа, а не как возврат каретки и перевод строки.
Я пытался использовать string.data (), но я получаю тот же результат, что и string.c_str ().
Есть ли какая-нибудь хорошая функция, чтобы получить ее правильно с самого начала, или мне нужно решить эту проблему с помощью обычной функции замены? Или какой-то другой способ, о котором я не думал?
Я думаю, если я не найду действительно аккуратный способ сделать это, я просто опущу \ r \ n в файле конфигурации и добавлю его потом, но было бы хорошо, чтобы все это было в файле конфигурации без каких-либо трудностей. кодирование. Я думаю, что мне нужно было бы также выполнить некоторое жесткое кодирование, если бы я попытался заменить четыре символа \ r \ n их правильными символами.
Спасибо за любую помощь
Редактировать:
Файл конфигурации содержит строки, подобные этой.
MONITOR_REQUEST = «TVT? \ R \ n»
Если данные в файле конфигурации требуют перевода, вы
надо перевести это. Если не считать регулярных выражений (которые
явно излишним для этого), я не знаю ни одного стандарта
функция, которая сделала бы это. Мы используем что-то вроде:
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"
для
последний к аргументам, например.
Похоже, ваш файл конфигурации на самом деле содержит 4 различных символа '\'
, 'r'
, '\'
, а также 'n'
… вы должны либо изменить файл (например, используя фактические окончания строк в файле для кодирования концов строк в строках, и даже в этом случае некоторые системы не будут использовать \ r \ n в качестве разделителей строк в текстовом файле), или сделайте замену / перевод, как вы предлагаете. Перевод является более портативным подходом. Это также может быть довольно быстро … просто поддерживать два указателя / итератора / индекса в строке — один для позиции чтения и один для записи, а также копировать при сжатии escape-записи.
Вам не нужно ничего кодировать в коде.
Вы можете очень хорошо читать символы для добавления к исходящей строке из того же файла конфигурации.
Предполагая, что у вас есть пара имя-значение в вашем файле conf:
APPEND_EOL = «\ n \ r» str_to_send1 = «это тест %% APPEND_EOL %%»
анализируя строку перед отправкой, вы можете сгенерировать фактическую строку.
Если вы не можете сохранить APPEND_EOL в той же строке, вы можете выбрать его из ENV со значением по умолчанию, если оно не определено, или, возможно, в другом вашем конфигурационном файле.