【问题标题】:Writing stringstream contents into ofstream将stringstream内容写入ofstream
【发布时间】:2010-09-24 09:27:14
【问题描述】:

我目前使用std::ofstream如下:

std::ofstream outFile;
outFile.open(output_file);

然后我尝试将std::stringstream 对象传递给outFile,如下所示:

GetHolesResults(..., std::ofstream &outFile){
  float x = 1234;
  std::stringstream ss;
  ss << x << std::endl;
  outFile << ss;
}

现在我的outFile 只包含垃圾:“0012E708”到处重复。

GetHolesResults我可以写

outFile << "Foo" << std:endl; 

它会在outFile中正确输出。

关于我做错了什么有什么建议吗?

【问题讨论】:

  • 我建议您将标题改写为:'writting stringstream contents into ofstream'(或重要的 ostream)
  • 埃里克,你应该将约翰内斯的回答标记为已接受,这样我就可以删除我的(这显然比他的做法更糟糕)
  • 好的,完成。但在过去,我使用了你的解决方案 =)
  • :) 今天有人对我的回答投了赞成票,这可能表明当有更好的解决方案可用时,他们选择了一个不太完美的解决方案。

标签: c++ stl parameters stringstream ofstream


【解决方案1】:

你可以这样做,不需要创建字符串。它使输出流在右侧读出流的内容(可用于任何流)。

outFile << ss.rdbuf();

【讨论】:

  • 我很好奇:为什么这个解决方案适用于std::stringstream,但不适用于std::ostringstream?在第二种情况下,我得到一个空文件。
  • @JaviV 因为你可以从only writestd::oANYSTREAM 并且只能从std::iANYSTREAM 读取。如果output_stream 也有read 操作,那么它就没有意义了。如果您两者都需要,只需使用std::ANYSTREAM 并且您在家:)
【解决方案2】:

我宁愿写ss.str(); 而不是ss.rdbuf();(并使用字符串流)。

如果您使用ss.rdbuf()outFile 的格式标志将被重置,从而使您的代码不可重用。 即,GetHolesResults(..., std::ofstream &amp;outFile) 的调用者可能想要写这样的东西来在表格中显示结果:

outFile << std::setw(12) << GetHolesResults ...

...想知道为什么忽略宽度。

【讨论】:

    【解决方案3】:

    如果您正在使用 std::ostringstream 并且想知道为什么使用 ss.rdbuf() 没有写入任何内容,请使用 .str() 函数。

    outFile << oStream.str();
    

    【讨论】:

    • 您的回答让我意识到:要从ss 获取char 数组,您可以使用ss.str().c_str()。 (这里只是为了让将来偶然发现这个问题的新手受益。)
    • @Digital_Reality,谢谢!当我使用 rdbuff 时没有写任何东西。这是什么原因?
    【解决方案4】:

    当将 stringstream rdbuf 传递给流时,不会翻译换行符。输入文本可以包含\n,因此查找替换不起作用。旧代码写入 fstream 并将其切换到 stringstream 会丢失 endl 转换。

    【讨论】:

    • 这应该是评论而不是答案,因为您还没有告诉如何将 std::stringstream 写入 std::ofstream
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 2021-10-30
    相关资源
    最近更新 更多