繁体   English   中英

使用Gecode打印到文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM