您的位置:首页 > Web前端

用"C原生API"写Symbian日志文件

2008-04-09 11:36 253 查看
声明:是我参考网上一片文章加上自己的理解写出来的!
        我们都知道Symbian里没办法象PC那样用printf()、Symtem.out.println()等来打印Debug信息到Cmd控制台,那么我们在Debug的时候只能用CEikonEnv::InfoMsg()来把信息输出到Symbian程序的窗口上,但是这个函数只能在模拟器上才起作用,调试起来也很不方面!还有一个办法就是把Debug信息输出到一个文本文件里,这样就能根据文本文件来调试Symbian程序。
    我们知道,在C语言里对文件的操作是利用FILE结构体进行的,具体实现时,首先需要利用fopen函数返回一个指向FILE结构体的指针,该函数的声明形式如下:

FILE *fopen(const char *filename,const char *mode);
filename参数就是一个指向文件名字符串的常量指针类型
mode指定文件打开的模式
mode的取值如下:
r:为读取而打开。如果文件不存在或不能找到,函数调用失败。
w:为写入操作打开一个空文件。如果给定的文件已经存在,那么它的内容将被清空。
a:为写入操作打开文件。如果文件已经存在,那么在该文件尾部添加新数据,在写入新的数据之前,不会移除文件中已有的EOF标记;如果文件不存在,那么首先创建这个文件。
r+: 打开文件用于写入操作和读取操作,文件必须存在。
w+:为写入操作和读取操作打开一个空的文件。如果给定文件已经存在,那么它的内容将被清空。
a+:打开文件用于读取操作和添加操作。并且添加操作在添加新数据之前会移除该文件中已有的EOF标记,然后当写入操作完成之后再恢复EOF标记。如果指定文件不存在,那么首先将创建这个文件。
文件的写入

size_t fwrite(const void *buffer,size_t size,size_t count,FILE *stream);
buffer:指向将要被写入文件的数据。
size:以字节为单位的项的大小。类型是size_t,实际上就是unsigned integer类型。
count:将要被写入的项的最大数目。
文件的读取也类似

size_t fread(void *buffer,size_t size,size_t count,FILE *stream);
由以上的知识,我们可以在Symbian项目中写入下面的代码,从而实现Symbian日志!

void debug(const char* aMsg)
{
   FILE* file = fopen("c://debug.log", "a+");
   fwrite(aMsg, sizeof(char), strlen(aMsg), file);
   fclose(file);
}

void debug(const TDesC& aMsg)
{
   FILE* file = fopen("c://debug.log", "a+");
   fwrite(aMsg.Ptr(), sizeof(int), aMsg.Length(), file);
   fclose(file);
}
我们还需修改我们的.mmp文件:

SYSTEMINCLUDE /epoc32/include/libc

LIBRARY estlib.lib
别忘了,mmp文件被修改后,还得重新build一次。比如:bldmake bldfiles。
最后,别忘了在你退出程序之前,调用下面这一行指令:

CloseSTDLIB();
我通常把它放在我的AppUi的destructor里面。没有这一行东西,你的程序在退出时会报错的。

刚才我们看了如何利用stdlib来写log。虽然很酷(至少我本人这样认为),但遗憾的是它不能给我们直接的信息显示!下面我们利用CConsoleBase来做一个简陋但实用的console出来。

假设我们的view class叫做CMyView

1. 在MyView.h里加入

public:
   void println(const TDesC& aMsg);

private:
   CConsoleBase* iConsole;
2. 在MyView.cpp里加入

void CMyView::println(const TDesC& aMsg)
{
   iConsole->Printf(aMsg);
}

void CMyView::ConstructL(const TRect& aRect)
{
   iConsole = Console::NewL(_L("MyConsole"), TSize(KConsFullScreen,KConsFullScreen));
   ...
}

void CMyView::~CMyView()
{
   ...
   delete iConsole;
}
              就这样,我们可以随时动用println()来往我们的console上写东西了。那么,怎样才能看到我们的console呢?很简单,按住那个"application"键不放就会弹出一个程序切换的东西,通过它我们就可以在我们的程序和console间随意切换了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐