将stringstream的内容写入到ofstream中

66

我目前使用以下方式的 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中。

对于我做错了什么,有任何建议吗?


1
我建议您将标题重新表述为类似于“将stringstream内容写入ofstream”(或对于相关事项为ostream)。 - David Rodríguez - dribeas
1
Eric,你应该将Johannes的答案标记为已接受,这样我就可以删除我的答案(显然比他的方法差)。 - David Rodríguez - dribeas
1
好的,完成了。但是在过去,我使用了你的解决方案 =) - Eric
今天有人给我的回答点了赞,这可能意味着当更好的解决方案可用时,他们选择了一个不太完美的解决方案。 - David Rodríguez - dribeas
4个回答

117

您可以这样做,无需创建字符串。它使输出流从右侧读取流的内容(可用于任何流)。

outFile << ss.rdbuf();

15
我很好奇:为什么这个解决方案可以使用 std::stringstream,但不能用 std::ostringstream?在第二种情况下,我得到了一个空文件。 - Javi
12
@JaviV,因为你只能向std::oANYSTREAM写入内容,而只能从std::iANYSTREAM读取内容。如果output_stream也包含了读取操作,那将没有意义。如果你需要两者都有,只需使用std::ANYSTREAM即可满足您的需求 :) - S.R
我在多年前点赞后又回来了。有点奇怪的是编译器没有警告关于从ostringstream调用rdbuf。 - Vinicius Almada

25

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

outFile << oStream.str();

11
你的回答让我意识到:要从ss中获得一个char数组,可以使用ss.str().c_str()。 (将其发布在这里是为了方便未来遇到这个问题的新手。) - abcd
2
@Digital_Reality,谢谢!当我使用rdbuff时,没有任何东西被写入。这是什么原因? - Nasir

4

使用stringstream的rdbuf作为流时,换行符不会被翻译。输入文本可以包含\n,因此查找替换无法解决问题。旧代码写入了一个fstream,将其切换到stringstream会丢失endl翻译。


6
这应该是一条评论而不是回答,因为您没有说明如何将std::stringstream写入std::ofstream。 - Alex Bitek

2

我更喜欢使用stringstream并写入ss.str();,而不是使用ss.rdbuf();

如果使用ss.rdbuf(),则outFile的格式标志将被重置,使您的代码无法重用。 例如,调用GetHolesResults(..., std::ofstream &outFile)的调用者可能想要编写以下内容以在表格中显示结果:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接