[英]Printing to file using Gecode
我正在做一个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输出中获取运行时和失败? 他们内置的打印功能可以做到这一点。
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,则可以直接从中调用其方法S-> print()您的main()方法,并在那里提供正确的文件流,即:
S* s= new S; // something like that
ofstream f("myfile.txt");
s->print(f);
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.