【问题标题】:Inserting endline into a stringstream将端线插入字符串流
【发布时间】:2011-10-15 11:25:38
【问题描述】:

我们知道,在文件流中插入\n 时,系统的适当行尾序列将写入文件(例如,\r\n 用于 Windows)。在std::stringstream 中插入结束行是否会导致将适合系统的行尾序列写入字符串?例如:

#include <sstream>

int main()
{
    std::ostringstream oss;
    oss << std::endl;
    std::string endlineSequence = oss.str();
    bool isWindows = enlineSequence == "\r\n";
    bool isOldMac  = endlineSequence == "\r";
    bool isUnix    = endlineSequence == "\n";
    // Will this work???
}

【问题讨论】:

  • 为了节省您的时间,您可以执行并查看程序中的所有bools 是否都是true... 很可能isWindowsisMac 将评估为@ 987654329@.
  • @Aditya:我必须在每个平台上进行尝试。不是每个人都可以使用 Windows、Mac 和 Unix 机器。 :-)
  • @Emile:不,你只需要在 Windows 中尝试。因为如果你写\n 并得到\r\n,它会翻译成本地换行符;如果你得到\n 它不会。但在 Linux 或 MacOS X 中并不明显。
  • 在 windows 和 linux 机器上,isUnix 评估为真。
  • @Aditya:谢谢。这验证了 Björn 的回答。

标签: c++ newline stringstream end-of-line


【解决方案1】:

系统特定的行尾仅与文本文件相关。只要流只在内存中,就只是'\n'

【讨论】:

  • 除了字符串流中的单个字符 '\n' 之外,它还能是什么?假设翻译是在字符串流上完成的。想想sstream1 &lt;&lt; "\n"; sstream2 &lt;&lt; stream1.str(); ...; std::cout &lt;&lt; sstream99.str(); 会导致的混乱
  • 也适用于 Windows OutputDebugStringA
【解决方案2】:

简答

长答案

文本模式下的文件流会将特定于平台的 ELS 插入文件中。但应用程序永远不会看到这一点,因为在读取文件时 ELS 会转换回 \n。因此,即使使用文件流(在文本模式下),您也永远不会看到 ELS。

返回std::stringstream。如果代码确实插入了特定于平台的 ELS(它没有插入),那么当您读取流时,您仍然希望在读回它时看到 \n,因为您希望 ELS 被转换回来。这样做没有什么意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多