【问题标题】:Convert a string's UNIX line endings to DOS line endings将字符串的 UNIX 行尾转换为 DOS 行尾
【发布时间】:2014-07-25 16:14:17
【问题描述】:

我想将字符串的 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' 不明确

谁能告诉我我做错了什么或建议我换行结束转换的不同方式?

【问题讨论】:

标签: c++ string newline


【解决方案1】:

你到底想做什么?在内部,无论系统如何,行结尾都是'\n'。如果您在Windows系统上,它们将在std::ifstreamstd::ofstream中正确转换,您不必担心(前提是您以文本模式打开文件)。 std::ifstream 将毫无问题地读取在 Unix 下编写的文件。 唯一你可能需要注意这个问题的时间是在 Windows 上编写和在 Unix 上阅读时;那么您可能会在'\n' 前面立即找到一个额外的'\r'。通常,这也不是问题,因为'\r' 算作合法空格,并且无论如何您都想忽略尾随空格。

在 C++ 程序中,您永远不会看到 '\r'

【讨论】:

  • 原来我根本不需要转换。谢谢!
【解决方案2】:

改编自this answer,Boost 有一个优秀的字符串操作库。而且因为它是 Boost,所以几乎可以保证它尽可能快。

使用boost::replace_all:

std::string str = readfromserver();
boost::replace_all(str, "\n", "\r\n");

如果您需要另辟蹊径(删除 \rs),您可以使用标准库算法,例如 remove_if 和 lambda。

【讨论】:

    【解决方案3】:

    我会将“\n”替换为本身不包含“\n”转义序列的内容,例如“\x0x0d\0x0a”。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多