当前位置: 首页 > news >正文

用C原生API写Symbian日志文件

声明:是我参考网上一片文章加上自己的理解写出来的!

我们都知道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日志!

<stdio.h></stdio.h>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间随意切换了。

相关文章:

  • go make function_Go中复制文件的3种技巧
  • 猪猪宝贝
  • 简述python文件操作_Python文件操作的几个要点与示例
  • 读书小结
  • tomcat线程被打满怎么排查_Tomcat面试题(2020最新版)
  • oc引导开机直接进_超级详细的oc引导制作过程(二)——config.plist的制作,从入门到入土...
  • 2007年你需要知道的五大技术
  • python中reader_关于Python 的这几个技巧,你应该知道
  • SVN时代...
  • sift算法双向匹配剔除不匹配点_【动手学计算机视觉】第七讲:传统目标检测之SIFT特征...
  • SVN应用
  • python怎么训练模型_如何在训练堆叠模型后预测python的数据?
  • 使用者的角度来看SVN
  • python输出文本居中_如何在Tkinter文本小部件中居中文本?
  • SVN pk CVS
  • Google 是如何开发 Web 框架的
  • 【刷算法】从上往下打印二叉树
  • Apache Zeppelin在Apache Trafodion上的可视化
  • cookie和session
  • export和import的用法总结
  • github从入门到放弃(1)
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • mysql常用命令汇总
  • Object.assign方法不能实现深复制
  • spring + angular 实现导出excel
  • windows-nginx-https-本地配置
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 码农张的Bug人生 - 初来乍到
  • 说说动画卡顿的解决方案
  • 小程序开发中的那些坑
  • python最赚钱的4个方向,你最心动的是哪个?
  • #预处理和函数的对比以及条件编译
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (分布式缓存)Redis分片集群
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .bat批处理(一):@echo off
  • .Mobi域名介绍
  • .mysql secret在哪_MySQL如何使用索引
  • .net 4.0发布后不能正常显示图片问题
  • .Net Core与存储过程(一)
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • []常用AT命令解释()
  • []串口通信 零星笔记
  • [20181219]script使用小技巧.txt
  • [383] 赎金信 js
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C++核心编程](四):类和对象——封装
  • [linux]centos7下解决yum install mysql-server没有可用包
  • [Linux]进程间通信(system V共享内存 | system V信号量)