0
#include <tcl.h>
int main(int argc, char** argv)
{
    Tcl_Interp *interp = Tcl_CreateInterp();

    Tcl_Channel stdoutChannel = Tcl_GetChannel(interp, "stdout", NULL);
    Tcl_UnregisterChannel(interp, stdoutChannel);

    Tcl_Channel myChannel = Tcl_OpenFileChannel(interp, "/home/aminasya/nlb_rundir/imfile", "w", 0744);

    Tcl_RegisterChannel(interp, myChannel);
    Tcl_Eval(interp, "puts hello");
}

このコードでは、stdout チャネルを閉じてファイルにリダイレクトしようとしました。(説明のようにGet the output from Tcl C Procedures )。実行後、「imfile」が作成されますが空です。何が間違っていますか?

How can I redirect stdout into a file in tclも見ましたが、Tcl C APIを使用してそれを行う必要があります。

私もこの方法を試しましたが、やはり結果はありません。

FILE *myfile = fopen("myfile", "W+");
Tcl_Interp *interp = Tcl_CreateInterp(); 
Tcl_Channel myChannel = Tcl_MakeFileChannel(myfile, TCL_WRITABLE);
Tcl_SetStdChannel(myChannel, TCL_STDOUT);
4

3 に答える 3

0

C API のレベルでは、Unix ベースの OS (つまり、Windows ではない) を使用していると仮定すると、適切な OS 呼び出しを使用することで、これをはるかに簡単に行うことができます。

#include <fcntl.h>
#include <unistd.h>

// ... now inside a function

    int fd = open("/home/aminasya/nlb_rundir/imfile", O_WRONLY|O_CREAT, 0744);
    // Important: deal with errors here!

    dup2(fd, STDOUT_FILENO);
    close(fd);

dup()必要に応じて後で復元できるように、古い stdout を (Tcl が単に無視する任意の番号に) 保存するために使用することもできます。

于 2013-04-18T05:09:12.093 に答える
0

これを試して:

FILE *myfile = fopen("myfile", "W+");
Tcl_Interp *interp = Tcl_CreateInterp(); 
Tcl_Channel myChannel = Tcl_MakeFileChannel(myfile, TCL_WRITABLE);
Tcl_RegisterChannel(myChannel);
Tcl_SetStdChannel(myChannel, TCL_STDOUT);

std チャネルをリセットして使用する前に、チャネルをインタプリタに登録する必要があります。

于 2013-05-07T01:27:46.967 に答える