C++ Carriage return and line feed in a string

user1728363 picture user1728363 · Jul 8, 2013 · Viewed 35.9k times · Source

I am working with the communication for some TCP/IP connected equipment in C++. The equipment requires that the commands sent are ended with \r\n.

I am using a configuration file from which I am reading the commands used in the communication.

The problem I have is that the commands \r\n are interpreted as the 4 characters they are and not as carriage return and line feed.

I have tried to use the string.data() but I get the same result as string.c_str().

Is there any nice function to get it correct from the beginning or do I have to solve this with a normal replace function? Or some other way that I have not thought about?

I guess, if I don't find a really neat way to do this I will just omitt the \r\n in the configuration file and add it afterwards, but it would be nice to have it all in the configuration file without any hard coding. I think I would need to do some hard coding as well if I would try to replace the four characters \r\n with their correct characters.

Thanks for any help

Edit: The config file contains lines like this one.

MONITOR_REQUEST = "TVT?\r\n"

Answer

James Kanze picture James Kanze · Jul 8, 2013

If the data in the configuration file requires translation, you have to translate it. Short of regular expressions (which are clearly overkill for this), I don't know of any standard function which would do this. We use something like:

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;
}

for this. You could call it with "\\r\\n", "\r\n" for the last to arguments, for example.