我正在做一个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输出获得运行时和故障?它们在打印功能中的内置实现了这一点。
发布于 2013-10-27 20:02:35
myfile << "s: " << s << std::endl;我没有在你的代码中看到任何s,它是什么?此外,打印方法的签名表明它已经获得输出流。这是真的吗?谁叫它,从哪里,用什么论点?如果其他方法真的调用print并给它输出流,那么您可能应该使用它,而不是创建自己的输出流。
更新:查看了Gecode的文档,发现了print()的定义:
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它会将所有内容打印到文件中,而不是控制台。
此外,如果您有ScriptBase派生类S,那么docs ( http://www.gecode.org/doc-latest/MPG.pdf )可以直接从main()方法调用它的方法S->print(),并在那里提供正确的文件流,即:
S* s= new S; // something like that
ofstream f("myfile.txt");
s->print(f);
...https://stackoverflow.com/questions/19622740
复制相似问题