将字符串的UNIX行结尾转换为DOS行结尾

时间:2014-07-25 16:14:18

标签: c++ string newline

我想将字符串的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'含糊不清

有人能告诉我我做错了什么或建议我采用不同的行结束转换方法吗?

3 个答案:

答案 0 :(得分:4)

你到底在想做什么?在内部,无论系统如何,行结尾都是'\n'。如果您使用的是Windows系统,则会在std::ifstreamstd::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”。