为什么我的输出会到cout而不是文件?

4

我正在进行一些与队列相关的科学工作。当提交到队列时,cout输出到一个指定名称的日志文件中。然而,我还想要将单独的输出写入文件,我是这样实现的:

ofstream vout("potential.txt"); ...
vout<<printf("%.3f %.5f\n",Rf*BohrToA,eval(0)*hatocm);

然而,它与输出到cout的内容混在一起,我只能在potential.txt中获得一些加密重复的数字。这是缓冲区问题吗?其他输出到其他文件的实例都可以正常工作...也许我应该将这个文件移动到一个不那么频繁使用cout的区域?

3个回答

6
你正在发送由printf返回的值到vout,而不是字符串。
你只需要简单地执行以下操作:
vout << Rf*BohrToA << " " << eval(0)*hatocm << "\n";

好的,谢谢。但是输出格式怎么处理呢?使用sprintf将其格式化为字符串并输出? - ntype
@ntype 你正在使用C++,因此可以使用操纵符来帮助格式化字符串:http://www.cprogramming.com/tutorial/iomanip.html - razlebe
@ntype - 如需完整的printf风格格式,请参见http://www.boost.org/doc/libs/1_46_1/libs/format/,对于简单的precision()、width()等,您可以使用ostream中的函数。 - Martin Beckett

2

你把C和C++搞混了。

printf是C库中的一个函数,用于将格式化的字符串打印到标准输出。使用ofstream和其<<运算符可以以C++风格向文件中打印内容。

你有两个选择,可以按照C方式或C++方式来打印输出。

C方式:

FILE* vout = fopen("potential.txt", "w");
fprintf(vout, "%.3f %.5f\n",Rf*BohrToA,eval(0)*hatocm);

C++风格:

#include <iomanip>
//...
ofstream vout("potential.txt");
vout << fixed << setprecision(3) << (Rf*BohrToA) << " ";
vout << setprecision(5) << (eval(0)*hatocm) << endl;

谢谢。实际上我没有接受过C/C++的正式培训,但是我正在与一个使用它们的RA小组一起工作。因此,我一直在从他们以前的工作中拼凑代码,并使用cplusplus.com的教程作为参考。 - ntype

0
如果您在*nix系统上,可以编写程序将其输出发送到stdout,然后使用管道和tee命令将输出定向到一个或多个文件中。例如:
$ command parameters | tee outfile

会导致命令的输出被写入到outfile以及控制台。

如果你安装了适当的工具(如GnuWin32),在Windows上也可以这样做。


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