如何屏蔽控制台的输出?

njaululu 2013-07-19 04:17:29
我在写个控制台程序,程序使用了别人的库函数,收到网络服务器的数据就会显示,我想屏蔽些输出,自己处理一下这些数据再在控制台窗口显示,该怎么办?或者有没有办法新打开一个控制台窗口,在新窗口中显示我处理过的数据也行。
...全文
1025 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lpcads 2013-07-20
  • 打赏
  • 举报
回复
把 stdout 和 stderr 关掉
njaululu 2013-07-20
  • 打赏
  • 举报
回复
谢谢各位了,因为一些特殊需求,最好将数据接收跟数据分析处理分开,我打算用内存共享的方式。
ken_scott 2013-07-19
  • 打赏
  • 举报
回复
原来,是引用后.... 样式、大小变了.... csdn的上贴的代码真丑。。。。。。
ken_scott 2013-07-19
  • 打赏
  • 举报
回复
没道理啊,为什么supermegaboy贴的代码的格式比我的好看??? 字体样式、大小不一样!怎么设置???
ken_scott 2013-07-19
  • 打赏
  • 举报
回复
引用 8 楼 supermegaboy 的回复:

std::fstream outFile( "output.txt" );
std::streambuf* oldBuf = std::cout.rdbuf( outFile.rdbuf() );
..............  //调用别人的库函数
..............  //对outFile的内容进行分析
std::cout.rdbuf( oldBuf );
..............  //输出处理过的内容
我虽然知道C的重定向,没想到C++的是这样子的, 向supermegaboy学习了!!!!

#include <cstdio>
#include <fstream>
#include <iostream>

/* 测试,每一行的字符倒序处理下 */
void handle_stream(const char * from, const char * to)
{
    std::ifstream fin(from);
    std::ofstream fout(to, std::ios::app);
    const int bufsiz = 512;
    char buffer[bufsiz];
    while (!fin.eof())
    {
        fin.getline(buffer, bufsiz);

        int count = fin.gcount();
        while (count > 0 && '\0' == buffer[count - 1])
        {
            buffer[count - 1] = '\n';
            count -= 1;
        }

        for (int i = 0; i < count / 2; ++i)
        {
            std::swap(buffer[i], buffer[count - 1 - i]);
        }

        fout << buffer;
    }
    fin.close();
    fout.close();
}

int main(int argc, char * argv[])
{
    /*     1      */
    // 重定向stdout、stderr到文件from_stdout.txt、from_stderr.txt
    FILE * new_stdout = freopen("from_stdout.txt", "w", stdout);
    FILE * new_stderr = freopen("from_stderr.txt", "w", stderr);

    /*     2      */
    // 重定向std::cout、std::cerr到文件from_cout_cerr.txt
    std::ofstream from_cout_cerr("from_cout_cerr.txt", std::ios::trunc);
    std::streambuf * old_cout = std::cout.rdbuf(from_cout_cerr.rdbuf());
    std::streambuf * old_cerr = std::cerr.rdbuf(from_cout_cerr.rdbuf());

    /*     3      */
    // 测试....
    fprintf(stdout, "first content, this is a message flush to stdout\n");
    fprintf(stderr, "second content, this is a message flush to stderr\n");
    std::cout << "third content, this is a message flush to std::cout" << std::endl;
    std::cerr << "fourth content, this is a message flush to std::cerr" << std::endl;

    /*     4      */
    // 测试完毕,关闭不需要的流
    fclose(new_stdout);
    fclose(new_stderr);
    from_cout_cerr.close();

    /*     5      */
    // 处理文件内容
    handle_stream("from_stdout.txt", "result.txt");
    handle_stream("from_stderr.txt", "result.txt");
    handle_stream("from_cout_cerr.txt", "result.txt");

    /*     6      */
    // 恢复各个输出流
    // 重新打开C、C++的标准输出、标准错误(流)
    // 发现:C的不打开的话,C++的流没法输出
    freopen("CON", "w", stdout);
    freopen("CON", "w", stderr);
    std::cout.rdbuf(old_cout);
    std::cerr.rdbuf(old_cerr);

    /*     7      */
    // 输出处理过的输出数据
    std::ifstream result("result.txt");
    std::cout << result.rdbuf();
    result.close();

    return(0);
}
代码经过测试,可用,不过各个文件的处理顺序,在真实场合很可能会有问题(文件锁保护下?) 不管了,如果这是楼主要的,结贴给分supermegaboy,我是来向他学习的!!!
飞天御剑流 2013-07-19
  • 打赏
  • 举报
回复
引用 9 楼 njaululu 的回复:
没有用,估计库函数是用cerr输出的。也可能是我用错了。 [quote=引用 8 楼 supermegaboy 的回复:] [quote=引用 楼主 njaululu 的回复:] 我在写个控制台程序,程序使用了别人的库函数,收到网络服务器的数据就会显示,我想屏蔽些输出,自己处理一下这些数据再在控制台窗口显示,该怎么办?或者有没有办法新打开一个控制台窗口,在新窗口中显示我处理过的数据也行。

std::fstream outFile( "output.txt" );
std::streambuf* oldBuf = std::cout.rdbuf( outFile.rdbuf() );
..............  //调用别人的库函数
..............  //对outFile的内容进行分析
std::cout.rdbuf( oldBuf );
..............  //输出处理过的内容
[/quote][/quote] 你用cerr代替那个cout试试,还有可能是使用C库函数的,是的话就是用freopen重定向。
njaululu 2013-07-19
  • 打赏
  • 举报
回复
没有用,估计库函数是用cerr输出的。也可能是我用错了。
引用 8 楼 supermegaboy 的回复:
[quote=引用 楼主 njaululu 的回复:] 我在写个控制台程序,程序使用了别人的库函数,收到网络服务器的数据就会显示,我想屏蔽些输出,自己处理一下这些数据再在控制台窗口显示,该怎么办?或者有没有办法新打开一个控制台窗口,在新窗口中显示我处理过的数据也行。

std::fstream outFile( "output.txt" );
std::streambuf* oldBuf = std::cout.rdbuf( outFile.rdbuf() );
..............  //调用别人的库函数
..............  //对outFile的内容进行分析
std::cout.rdbuf( oldBuf );
..............  //输出处理过的内容
[/quote]
飞天御剑流 2013-07-19
  • 打赏
  • 举报
回复
引用 楼主 njaululu 的回复:
我在写个控制台程序,程序使用了别人的库函数,收到网络服务器的数据就会显示,我想屏蔽些输出,自己处理一下这些数据再在控制台窗口显示,该怎么办?或者有没有办法新打开一个控制台窗口,在新窗口中显示我处理过的数据也行。

std::fstream outFile( "output.txt" );
std::streambuf* oldBuf = std::cout.rdbuf( outFile.rdbuf() );
..............  //调用别人的库函数
..............  //对outFile的内容进行分析
std::cout.rdbuf( oldBuf );
..............  //输出处理过的内容
www_adintr_com 2013-07-19
  • 打赏
  • 举报
回复
Google 输出重定向
njaululu 2013-07-19
  • 打赏
  • 举报
回复
不好意思,有点看不懂。 我想不如直接用另一个程序读取内存,再处理输出。试了下,好像内存有保护,直接读取会出错。
引用 4 楼 turingo 的回复:
或者第二个程序也用控制台的方式,不过没有试过,你可以参考http://blog.sina.com.cn/s/blog_56dee71a01009z64.html [quote=引用 2 楼 njaululu 的回复:] [quote=引用 1 楼 turingo 的回复:] 可以这样: 1、第一个控制台程序收到网络服务器的数据就会直接显示; 2、第二个GUI程序运行第一个程序,然后通过管道获取输出信息,最后处理过后再丢给GUI进行显示。
我C++编程只自学了个皮毛,不会也不想学着写GUI程序,能否只用控制台程序?管道如何实现,能否详细说一下。 另外,我下载的源码工程是VS工程,我下载安装了个VC2008 express,没有MFC库,不好写界面。[/quote][/quote]
njaululu 2013-07-19
  • 打赏
  • 举报
回复
能具体说说怎么实现的吗?
引用 3 楼 Automation_dmu 的回复:
实现一个过滤程序。 控制台程序的输入重定向到过滤的输出;过滤程序的输入重定向到控制台程序的输出。
图灵狗 2013-07-19
  • 打赏
  • 举报
回复
或者第二个程序也用控制台的方式,不过没有试过,你可以参考http://blog.sina.com.cn/s/blog_56dee71a01009z64.html
引用 2 楼 njaululu 的回复:
[quote=引用 1 楼 turingo 的回复:] 可以这样: 1、第一个控制台程序收到网络服务器的数据就会直接显示; 2、第二个GUI程序运行第一个程序,然后通过管道获取输出信息,最后处理过后再丢给GUI进行显示。
我C++编程只自学了个皮毛,不会也不想学着写GUI程序,能否只用控制台程序?管道如何实现,能否详细说一下。 另外,我下载的源码工程是VS工程,我下载安装了个VC2008 express,没有MFC库,不好写界面。[/quote]
AndyStevens 2013-07-19
  • 打赏
  • 举报
回复
实现一个过滤程序。 控制台程序的输入重定向到过滤的输出;过滤程序的输入重定向到控制台程序的输出。
njaululu 2013-07-19
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
可以这样: 1、第一个控制台程序收到网络服务器的数据就会直接显示; 2、第二个GUI程序运行第一个程序,然后通过管道获取输出信息,最后处理过后再丢给GUI进行显示。
我C++编程只自学了个皮毛,不会也不想学着写GUI程序,能否只用控制台程序?管道如何实现,能否详细说一下。 另外,我下载的源码工程是VS工程,我下载安装了个VC2008 express,没有MFC库,不好写界面。
图灵狗 2013-07-19
  • 打赏
  • 举报
回复
可以这样: 1、第一个控制台程序收到网络服务器的数据就会直接显示; 2、第二个GUI程序运行第一个程序,然后通过管道获取输出信息,最后处理过后再丢给GUI进行显示。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧