首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C++与Stockfish外壳接口

用C++与Stockfish外壳接口
EN

Stack Overflow用户
提问于 2015-08-30 21:39:40
回答 1查看 1.7K关注 0票数 4

我正在尝试编写一个程序,通过命令行与Stockfish国际象棋引擎接口。我已经研究过使用管道和重定向cin/cout,但问题是Stockfish运行自己的shell,而不是只提供一行输出,例如:

代码语言:javascript
复制
~$ stockfish 
Stockfish 261014 64 by Tord Romstad, Marco Costalba and Joona Kiiski
> go movetime 5000
[output]
...
> quit
~$

我尝试了以下代码(来自here)来读取执行命令并将它们读取回来,但当我试图运行Stockfish并打印输出时,它从未完成:

代码语言:javascript
复制
#include <string>
#include <iostream>
#include <stdio.h>

std::string exec(char* cmd) {
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[128];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 128, pipe) != NULL)
            result += buffer;
    }
    pclose(pipe);
    return result;
}

int main(void)
{
    std::cout << exec("ls") << std::endl; // this works fine
    std::cout << exec("stockfish") << std::endl; // this never ends

    return 0;
}

我的问题是,为什么这不起作用,我如何才能编写一个程序来发送和接收来自Stockfish shell的文本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-30 22:22:35

只有在管道上检测到EOF时,才能完成while循环,这在popen'd命令终止之前是不会发生的。它在等待输入的事实本质上是无法察觉的。

因为popen只重定向了stdout,所以波芬会与您的程序共享stdin。当您启动河豚时,它将尝试读取输入。如果你不打字,什么事都不会发生。

因此,您应该尝试将希望它执行的命令发送给斯托克鱼,并以“退出”命令结尾。

Popen只允许您发送或接收数据,具体取决于操作数的模式。你不能两者兼得。您可以使用通常的forkexec技术,也可以使用stockfish < sfcmds.txt之类的技术。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32301415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档