C ++回车符和换行符

时间:2013-07-08 09:08:22

标签: c++ string carriage-return linefeed

我正在使用C ++中的某些TCP / IP连接设备进行通信。 设备要求发送的命令以\ r \ n。

结束

我正在使用配置文件,我正在阅读通信中使用的命令。

我遇到的问题是命令\ r \ n被解释为4个字符,而不是回车符和换行符。

我试过使用string.data()但是我得到了与string.c_str()相同的结果。

是否有任何好的功能可以从一开始就正确使用或者我必须使用普通的替换功能解决这个问题吗?或者其他一些我没想过的方式?

我想,如果我找不到一个非常简洁的方法来做到这一点,我只会在配置文件中省略\ r \ n并在之后添加它,但是在配置文件中将它全部包含在一起会很不错没有任何硬编码。我想如果我尝试用正确的字符替换四个字符\ r \ n,我还需要做一些硬编码。

感谢您的帮助

编辑: 配置文件包含这样的行。

MONITOR_REQUEST =“TVT?\ r \ n”

3 个答案:

答案 0 :(得分:3)

听起来您的配置文件实际上包含4个不同的字符'\''r''\''n' ...您必须更改文件(例如,使用文件中的实际行结尾用于对字符串中的行结尾进行编码,即使这样,某些系统也不会使用\ r \ n作为文本文件行分隔符),或者按照您的建议进行一些替换/翻译。翻译是更便携的方法。它也可以非常快......只需将两个指针/迭代器/索引保存到字符串中 - 一个用于读取位置,一个用于写入,并在压缩转义符号时复制。

答案 1 :(得分:3)

如果配置文件中的数据需要翻译,那么您 必须翻译它。没有正则表达式(这是 显然有点过头了),我不知道有什么标准 能做到这一点的功能。我们使用类似的东西:

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"来调用它 例如,最后的论点。

答案 2 :(得分:1)

您无需在代码中使用任何代码。 您可以很好地从相同的配置文件中读取要附加到传出字符串的字符。

假设您的conf文件中有名称值对:

APPEND_EOL = “\ n \ R” str_to_send1 =“这是测试%% APPEND_EOL %%”

在发送之前解析该行可以生成实际行。 如果你不能将APPEND_EOL存储在同一行中,那么你可以从ENV中选择它,如果没有定义它,或者可能在你的另一个配置文件中。