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