我想将字符串的UNIX行结尾转换为DOS行,因为我的程序与在基于Linux的操作系统上运行的服务器通信。我尝试过使用std :: replace:
std::string str = readfromserver();
std::replace(str.begin(), str.end(), "\n", "\r\n");
但是我收到了以下编译错误:
错误C2782:'void std :: replace(_FwdIt,_FwdIt,const _Ty&,const _Ty&)':模板参数'_Ty'含糊不清
有人能告诉我我做错了什么或建议我采用不同的行结束转换方法吗?
答案 0 :(得分:4)
你到底在想做什么?在内部,无论系统如何,行结尾都是'\n'
。如果您使用的是Windows系统,则会在std::ifstream
和std::ofstream
中正确转换它们,您不必担心它(如果您以文本模式打开文件)。并且std::ifstream
将读取在Unix下编写的文件而没有问题。您可能必须注意这个问题的唯一时间是在Windows上编写和在Unix上阅读时;然后你可能会在'\r'
前面找到一个额外的'\n'
。通常情况下,这也不是问题,因为'\r'
计算为合法的空格,并且您想要忽略尾随空格。
在C ++程序中,您永远不应该看到'\r'
。
答案 1 :(得分:1)
改编自this answer,Boost拥有出色的字符串操作库。而且因为它是Boost,它几乎可以保证尽可能快。
使用boost::replace_all
:
std::string str = readfromserver();
boost::replace_all(str, "\n", "\r\n");
如果您需要采用其他方式(删除\r
),您可以使用标准库算法,例如remove_if
和lambda。
答案 2 :(得分:0)
我将“\ n”替换为本身不包含“\ n”转义序列的内容,例如“\ x0x0d \ 0x0a”。