首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >freopen:恢复到原始流

freopen:恢复到原始流
EN

Stack Overflow用户
提问于 2009-11-04 21:32:05
回答 2查看 5.4K关注 0票数 9

我需要将stdout转发到不同的文件,以分离生成的一些打印,并将其恢复为正常的stdout。

我使用freopen以这种方式切换到该文件:

代码语言:javascript
复制
char name[80];
memset(name, 0, 80);
strcpy(name, "./scripts/asm/");
strcat(name, m_func->m_name->m_value);
strcat(name, ".shasm");
freopen(name, "w", stdout);

它实际上是有效的,但在过程结束时(请记住,stdout以之前相同的方式被多次重定向),我无法将其恢复为原始stdout。我尝试了以下几种方法:

代码语言:javascript
复制
freopen("/dev/stdout", "w", stdout);

但它似乎不起作用..仅供参考,我正在macosx上开发。

我该怎么办?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-04 21:53:56

这可以使用fileno、dup和dup2调用来实现。我已经在linux上尝试过了,不确定这是否能在mac上工作,但我相信你会得到一些与你的设置相同的功能。看看这个示例代码是否适合您。抱歉,代码中缺少错误处理。:)

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

    main()
    {
        int    fd;
        fpos_t pos;

        printf("stdout, ");

        fflush(stdout);
        fgetpos(stdout, &pos);
        fd = dup(fileno(stdout));
        freopen("stdout.out", "w", stdout);

        f();

        fflush(stdout);
        dup2(fd, fileno(stdout));
        close(fd);
        clearerr(stdout);
        fsetpos(stdout, &pos);        /* for C9X */

        printf("stdout again\n");
    }

    f()
    {
    printf("stdout in f()");
    }
票数 13
EN

Stack Overflow用户

发布于 2009-11-04 21:35:29

这看起来像是解决你问题的一种间接的方法。为什么不直接用fopen()打开每个文件,然后用fputsfprintffwrite等写到它的FILE *呢?不需要重定向stdout。

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

https://stackoverflow.com/questions/1673764

复制
相关文章

相似问题

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