本文共 3741 字,大约阅读时间需要 12 分钟。
如下的代码:
#include#include #include #include #include #include using namespace std;int main(int argc, char *argv[]){ cout << "The std cout output msg" << endl; qDebug() << "The qDebug output msg"; qInfo() << "The qInfo output msg"; qWarning() << "The qWarning output msg"; qCritical() << "The qCritical output msg"; qFatal("The qFatal output msg"); return 0;}
在Linux中程序有2个关键,一个是标准输出,一个是标准错误,在C语言中,有stderr和stdout。
程序运行截图如下:
如果把标准输出重定向到1.txt文件中:那么屏幕就只会输出stderr
然后把标准错误放到标准输出上这样屏幕就不会打印东西了:
所有的数据都将在1.txt中:
下面来说下这个的作用,本人在搞开发的时候,经常改别人的程序,或者在xx程序中进行二次开发,这样的话就有个问题,大量的打印。
当别人程序里面只有cout作为输出的时候,
自己可以使用qDebug()进行打印,然后把标准输出重定向,这样标准错误就会打印到屏幕上了。
下面问题来了,当那个项目里面又有人cout、qDebug这样改怎么搞,下面提供3个解决思路。
第一个,将qDebug改为stdout,自己使用qInfo或其他几个进行输出。然后就和上面一样了,代码如下:
#include#include #include #include #include #include using namespace std;void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){ QByteArray localMsg = msg.toLocal8Bit(); switch(type){ case QtDebugMsg: fprintf(stdout, "qDebug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtInfoMsg: fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtWarningMsg: fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); abort(); }}int main(int argc, char *argv[]){ qInstallMessageHandler(messageOutput); cout << "The std cout output msg" << endl; qDebug() << "The qDebug output msg"; qInfo() << "The qInfo output msg"; qWarning() << "The qWarning output msg"; qCritical() << "The qCritical output msg"; qFatal("The qFatal output msg"); return 0;}
程序运行截图如下:
这种方式是不是很有用
第二种就不演示了,就提一下。把QtDebugMsg中不提供打印,然后自己用其他几个输出。
第三个:记录到文件中,这里可以加个当前时间,这样就和日志一样了,比如自己用Warning记录到文件里面:
程序源码如下:
#include#include #include #include #include #include #include #include #include using namespace std;void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){ QByteArray localMsg = msg.toLocal8Bit(); switch(type){ case QtDebugMsg: fprintf(stdout, "qDebug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtInfoMsg: fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtWarningMsg: { QFile file("myOut.txt"); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){ break; } QTextStream out(&file); out << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") < << "\n"; file.close(); } break; case QtCriticalMsg: fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); abort(); }}int main(int argc, char *argv[]){ qInstallMessageHandler(messageOutput); cout << "The std cout output msg" << endl; qDebug() << "The qDebug output msg"; qInfo() << "The qInfo output msg"; qWarning() << "The qWarning output msg"; qCritical() << "The qCritical output msg"; qFatal("The qFatal output msg"); return 0;}
程序运行截图如下:
相应的文件:
是不是改别人代码的时候好调试多了。
转载地址:http://cnmif.baihongyu.com/