`
totoxian
  • 浏览: 1073897 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

用"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间随意切换了。

分享到:
评论

相关推荐

    利用Android原生API打开文件demo

    在这个“利用Android原生API打开文件demo”中,我们将深入探讨如何使用Android的原生API来创建这样一个功能。 首先,Android提供了一个名为`Intent`的机制,它允许应用程序之间进行通信。在文件选择的情境下,我们...

    学习OC的Socket编程,本demo是基于C语言原生API的.zip

    在Objective-C中,我们通常会使用Foundation框架中的`NSStream`类来处理Socket通信,但这个示例使用了C语言的原生API,如`socket()`、`bind()`、`listen()`、`accept()`、`connect()`、`send()`和`recv()`等函数。...

    VB利用官方api读写JSON数据格式文件简单实例

    在VB(Visual Basic)编程环境中,使用官方API来读写JSON数据格式文件是常见的操作,尤其是在处理网络数据交换或者存储配置信息时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和...

    c++记录日志到文件里面

    在C++编程中,记录日志到文件是一个重要的任务,特别是在开发复杂系统或者进行调试时。日志系统可以帮助我们追踪程序运行过程中的错误、异常和关键事件,以便于后期分析和解决问题。本篇将深入探讨如何在C++中实现...

    vue 使用外部JS与调用原生API操作示例

    本文将基于标题和描述提供的内容,详细阐述如何在Vue.js项目中使用外部JavaScript库以及调用原生API的操作技巧和注意事项。 首先,关于如何在Vue.js项目中使用外部JavaScript库,通常有几种常见的方式。例如,可以...

    ios-ios原生API实现二维码的扫描、识别以及生成.zip

    在iOS开发中,原生API提供了强大的能力来处理二维码(QR Code)的扫描、识别和生成。本项目"ios-ios原生API实现二维码的扫描、识别以及生成.zip"旨在通过一个名为QRCode_Demo的示例应用,演示如何利用这些API进行...

    java实现短信发送功能(java原生API实现)

    Java 实现短信发送功能主要涉及网络通信和协议处理,这里我们主要探讨如何使用Java原生API来完成这一任务。在Linux环境下,通过构建可执行的jar包,我们可以将这个功能集成到任何系统中,无需依赖特定的开发环境。 ...

    Asp.Net WebApi 上传文件方法(原生js上传和JQ ajax上传)

    以上就是使用Asp.Net WebApi结合原生JavaScript和jQuery AJAX实现文件上传的基本步骤。在实际应用中,还需要考虑错误处理、进度显示、多文件上传等复杂情况。在Dikeko.Upload.File这个文件中,可能包含了更详细的...

    MTK平台支持Android 原生API打开USB摄像头patch

    该patch支持Google自带相机打开USB摄像头,无需libuvc支持,也就是说应用就像处理mipi camera一样处理usb camera即可。注此patch基于MT8163,其他平台做相应移植即可

    c/c++使用原生windows API编写2048

    使用c++语言调用windows api编写2048游戏,只有最基本的游戏和记分功能,学了windows程序设计想要练下手的可以看下。

    Android-对es2.3.3原生api的封装

    Elasticsearch是一种强大的开源搜索引擎,常用于大数据分析和实时数据检索,但在移动设备上直接使用其原生API可能存在性能和兼容性问题。 1. **Elasticsearch简介**: Elasticsearch是一个基于Lucene的分布式、...

    Zookeeper 原生api zkClient Curator操作

    在Java开发中,我们通常使用三种方式来操作Zookeeper:原生API、zkClient和Curator。接下来,我们将详细探讨这三种方式。 **一、Zookeeper原生API** Zookeeper提供了Java API,可以直接与Zookeeper服务器进行交互...

    Android JNI 用C函数写本地库读写文件,底层调用小例子

    这个小例子展示了如何使用JNI和C语言来创建一个本地库,用于执行文件的读写操作,从而实现底层的高效控制。下面将详细阐述Android JNI、C语言在Android中的应用以及如何实现文件的读写。 首先,我们需要了解JNI的...

    SSM笔记-Servlet原生API作为参数

    本笔记主要探讨的是如何在SpringMVC中使用Servlet的原生API作为参数,这涉及到对Servlet API的深入理解和SpringMVC框架的集成运用。 1. **Servlet API基础** Servlet是Java EE规范的一部分,主要用于处理HTTP请求...

    android 原生API官方文档部分汉化

    《Android原生API官方文档部分汉化》 在Android开发领域,掌握官方API文档是至关重要的,因为它提供了详细的API接口、类库以及方法说明,帮助开发者深入理解Android系统的运作机制和编程模型。虽然大部分Android...

    Android BLE蓝牙与硬件通信(原生API)

    源码包含内容介绍: 1.Android手机通过蓝牙...控制手机音量 3. 实现控制第三方音乐播放器暂停、播放 4.使用AudioRecord和AudioTrack边录边播 详情请查看:https://blog.csdn.net/dengshunhao/article/details/82222296

    Spring JMSTemplate 与 JMS 原生API比较

    标题 "Spring JMSTemplate 与 JMS 原生API比较" 涉及到的是Java消息服务(Java Message Service,JMS)在Spring框架中的使用,特别是Spring提供的JMSTemplate与JMS原生API之间的差异。JMS是一种标准接口,用于在...

    原生js手写tree树形分类选择插件

    5. **API设计**:为了让插件更易用,可以设计一套API,如`init(treeData)`初始化树,`expand(node)`展开节点,`collapse(node)`折叠节点,`select(node)`选择节点,`getSelectedNodes()`获取已选择的节点等。...

    07-小程序原生 API.md

    07-小程序原生 API

Global site tag (gtag.js) - Google Analytics