我正在做一个Gecode项目,代码应该输出一个如下所示的文件:
n: 17
x: {0, 0, 16, 18, 17, 31, 32, 0, 34, 10, 30, 37, 38, 30, 30, 10}
y: {0, 27, 28, 14, 0, 31, 20, 17, 11, 17, 0, 0, 6, 7, 11, 25}
s: 43
runtime: 0.137
failure: 127
以上是代码应输出的示例。我试图做以下代码:
virtual void
print(std::ostream& os) const {
string filename = "project1-t15-n" + n + ".txt";
ofstream myfile;
myfile.open (filename);
myfile << "n: " << n << std::endl;
myfile << "x: {";
for (int i = 0; i < x.size(); i++) {
if (i != 0) {
myfile << ", ";
}
myfile << x[i];
}
myfile << "}" << std::endl;
myfile << "y: {";
for (int i = 0; i < y.size(); i++) {
if (i != 0) {
myfile << ", ";
}
myfile << y[i];
}
myfile << "}" << std::endl;
myfile << "s: " << s << std::endl;
//???????????????????????????????? print runtime and failures
myfile.close();
}
我知道n,s,x和y是正确的,但我有两个问题:
1:打印到文件时,print(std::ostream& os) const
是否正确使用?
2:如何从Gecode输出中获得运行时和故障?他们的打印功能就是这样做的。
答案 0 :(得分:1)
myfile << "s: " << s << std::endl;
我在您的代码中看不到任何s
,它是什么?此外,您的打印方法的签名表明它已经获得输出流。这是真的?谁来称呼它,从哪里和哪个论点?如果其他一些方法真的调用print并给它输出流,那么你可能应该使用它,而不是创建自己的。
更新:查看了Gecode的文档,找到了print()的定义:
http://www.gecode.org/doc-latest/reference/driver_8hh_source.html#l00666
所以你可以在你自己的类中重新定义这个方法,这个方法来自ScriptBase(我猜你应该如何编写Gecode的东西),但你应该使用提供的参数,即:
virtual void
print(std::ostream& os) const {
os << "n: " << n << std::endl;
os << "x: {";
// etc
实际打印到特定文件i / o控制台的一个选项就是使用重新路由输出运行程序。例如。如果您的程序名为myprogram,而您的文件名为myfile.txt,请将其运行为:
myprogram >> myfile.txt
它会将所有内容打印到文件而不是控制台。
另外,就文档(http://www.gecode.org/doc-latest/MPG.pdf)而言,如果你有ScriptBase派生类S,你可以直接从你的main()方法调用它的方法S-&gt; print(),并提供正确的文件流,即:
S* s= new S; // something like that
ofstream f("myfile.txt");
s->print(f);
...