首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么屏蔽控制台的输出

2013-08-01 
如何屏蔽控制台的输出?我在写个控制台程序,程序使用了别人的库函数,收到网络服务器的数据就会显示,我想屏

如何屏蔽控制台的输出?
我在写个控制台程序,程序使用了别人的库函数,收到网络服务器的数据就会显示,我想屏蔽些输出,自己处理一下这些数据再在控制台窗口显示,该怎么办?或者有没有办法新打开一个控制台窗口,在新窗口中显示我处理过的数据也行。
[解决办法]
可以这样:
1、第一个控制台程序收到网络服务器的数据就会直接显示;
2、第二个GUI程序运行第一个程序,然后通过管道获取输出信息,最后处理过后再丢给GUI进行显示。
[解决办法]
实现一个过滤程序。
控制台程序的输入重定向到过滤的输出;过滤程序的输入重定向到控制台程序的输出。

[解决办法]
Google 输出重定向
[解决办法]

引用:
我在写个控制台程序,程序使用了别人的库函数,收到网络服务器的数据就会显示,我想屏蔽些输出,自己处理一下这些数据再在控制台窗口显示,该怎么办?或者有没有办法新打开一个控制台窗口,在新窗口中显示我处理过的数据也行。



std::fstream outFile( "output.txt" );
std::streambuf* oldBuf = std::cout.rdbuf( outFile.rdbuf() );
..............  //调用别人的库函数
..............  //对outFile的内容进行分析
std::cout.rdbuf( oldBuf );
..............  //输出处理过的内容


[解决办法]
引用:

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,我是来向他学习的!!!

[解决办法]
把 stdout 和 stderr 关掉

热点排行