fx-9860GSDK开发从入门到实践 第二章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一共五个页面,字符有数学符号、特殊符号、希腊字符(大小写)和小字符字母。这么 多的字符,就算带上有符号的 char,也一共 256 个位置,肯定不够用。所以 9860 SDK 定义 了一种双字节的 FONTCHARACTER 类型来表示自己的字符集(这样记 FONT + CHARACTER)。 但是双字节的类型好是好,但是不能像 char 用字符串来初始化,写文件名的时候岂不 是很麻烦?一个 ”\\fls0\file” 岂不是要写成(注意,字符’\’写成 C 一定写成转义 字符’\\’):
Bfile_CloseFile (file_handle); return 0; }
int AddIn_main(int isAppli, unsigned short OptionNum)
{ unsigned int key; int i; i = create_and_write_file(); locate(1,1); if (i==-1){ Print((unsigned char *)"can not create file");GetKey(&key); return 1; }else if(i==-2){ Print((unsigned char *)"can not open file"); GetKey(&key); return 1; }else{ Print("Created 'TEST.txt'."); } while(1){ GetKey(&key); } return 1;
好了,接下来我们开始文件搜索的学习。
如图,闪存中共有五个文件,我们来写一个函数,在自己的程序中输出这个文件列表。 下面是可以编译的完整源码:
#include "fxlib.h" #include "stdio.h"
typedef unsigned char uchar;
/* [文件类型信息列表] 宏 DT_DIRECTORY ~ DT_VOLUME 值从 0 h ~ A h 递增, 所以可以直接作为下标来读取信息
通用文件操作函数
Bfile_ReadFile Bfile_WriteFile Bfile_SeekFile Bfile_CloseFile Bfile_GetMediaFree Bfile_GetFileSize
读 文件 写 文件 文件读写定位 关闭文件 获取剩余空间(内存、闪存、SD) 获取文件大小
{
int i,len = strlen(cFileName);
第二章
文件与控制函数(Bfile and Control)
入门部分
第一节:文件
不知到大家在 Windows(或其他操作系统)下学习 C 语言时喜不喜欢文件操作。在 VC 中,我们经常使用这样的操作:
FILE * fp; fp = fopen("file name","type");
在 9860 中,没有缓冲系统,使用的文件函数与<io.h>、<fctrl.h>中的非缓冲文件函数类似。 下面是这文件操作函数:
下面介绍一下文件打开方式:
_OPENMODE_READ
只读打开
_OPENMODE_READ_SHARE
只读打开(可与其它进程共享)
_OPENMODE_WRITE
只写打开
_OPENMODE_READWRITE
读写打开
_OPENMODE_READWRITE_SHARE
读写打开(可与其它进程共享)
在这里说一下这个_SHARE 是什么。_SHARE 只有在 SDK 模拟器调试的时候才管用。 SDK 模拟的 SD Card 就是你工程的那个“SDCard”件夹。在你的程序读文件的时候,如果没 有_SHARE,其他应用程序是读不了你打开的文件的。而在 9860 真机上运行的时候,不存 在多线程,也就无所谓了。
如果运行成功应显示出文档的内容(只在第一行)
好了,相信大家对文件的操作有一定了解了。由于没有专门的 ASCII 文件操作函数,
我们刚才所有的功能都是使用二进制文件操作函数完成的,所以二进制文件读写请大家自己 实践。目录的操作和文件的其他操作(删除等)都很简单,请大家自己参看 fx-9860G Libraries。
FONTCHARACTER font_file_name[]= {'\\','\\','f','l','s','0','\\','f','i','l','e'};
这不是要把人累死吗?所以我们依然封装一个函数。
FONTCHARACTER * char_to_font(const char *cFileName,FONTCHARACTER *fFileName) {
Bfile_DeleteMainMemory
删除内存文件
我们通过一些实践来学习这些函数的使用方法。
首先我们讨论一下字符集的问题。ASCII 字符集中有 128 个字符,包括一些可显示字符 和非可显示字符(控制字符)。由此我们可知表示此字符集需要的字节数为 log(2,128) = 7 。 再加上一个符号位(最高位是符号位),就成了现在的 char 是 8 位的情况。(事实上早期 IBM 机器上 8 bit=1 byte 就成为定例了)。ASCII 128 个字符都是无符号的。 但是 ASCII 是一个完全的美国标准(正如“ASCII”第一个字符代表的 American),很 多其他国家的字符没有(拉丁语系中还有不少需要带发音符号的情况。比如《Windows 游戏 编程的作者》叫 André LaMothe)。所以此后陆陆续续有一些拓展字符集(使用 char 的带符 号字符),最终出现了 Unicode。Unicode 每一个字符占 16 位两字节。 我们来看看 9860 的字符集,如果你觉得手里的 fx-9860G Character Set 看着不方便, 可以打开 9860 的 PRGM,试着打开 Select Character
},
{". (Current directory)" },
{"..(Parent directory)" },
{"Volume label"
}
};
/* [文件名转换函数]
FONT <=> CHAR
*/ FONTCHARACTER * char_to_font(const char *cFileName,FONTCHARACTER *fFileName)
*/
const uchar * const TYPE_INFO_LIST[]=
{
{"Directory"
},
{"File"
},
{"Add-In application" },
{"eActivity"
},
{"Language"
},
{"Bitmap"
},
{"Main Memory data"
},
{"Temporary data"
int AddIn_main(int isAppli, unsigned short OptionNum) {
unsigned int key; char * text; int i; i = read_text_file(&text); locate(1,1); if (i==-1){
Print((unsigned char *)"can not open file");GetKey(&key); return 1; }else if (i==0){ Print((unsigned char *)"no enough memory");GetKey(&key); return 1; }else{ Print((unsigned char *)text);GetKey(&key); free(text); } while(1){ GetKey(&key); } return 1; }
}
打开,运行一下。运行成功的话显示以下画面:
打开“SDCard “可以看到文件 TEST.txt,点开看看吧:
如果这时再次运行程序,就会导致这样的结果……
文件已存在,当然无法创建了 ASCII 文本读入(需要"stdlib.h",文本文件 Test.txt,为了省事就直接使用刚才创建的)
int read_text_file (char ** text)
return -1; } file_handle = Bfile_OpenFile(font_file_name,_OPENMODE_WRITE); /* 检测打开是否创建成功 失败时返回的文件句柄小于零 */ if (file_handle<0){
return -2; } /* 写入文本 */ Bfile_SeekFile (file_handle,0); Bfile_WriteFile (file_handle,text,len);
Bfile_FindNext
搜索下一文件 ┣ 配合使用
Bfile_FindClose
文件搜索结束 ┛
内存文件操作函数
Bfile_OpenMainMemory
打开内存中的文件
Bfile_CreateMainMemory
创建内存文件
Bfile_RenameMainMemory
重命名内存文件
闪存/SD 卡文件操作函数
Bfile_OpenFile
打开文件
Bfile_CreateFile
创建文件
Bfile_CreateDirectory
创建目录
Bfile_DeleteFile
删除文件
Bfile_DeleteDirectory
删除目录
Bfile_FindFirst 文件搜索过程开始 ┓
FONTCHARACTER font_file_name[32]; char_to_font ("\\\\fls0\\file",font_file_name);
不 过 , 你 现 在 可 能 对 ”\\fls0\” 这 样 的 写 法 感 到 奇 怪 了 。 ”fls0”指 的 是 闪
存,”crd0”指的是 SD 卡。文件名(可以有路径)跟在”\\fls0\”或”\\crd0\”的后面。
return -1; len = Bfile_GetFileSize (file_handle); *text = (char*)malloc(len+1); /* 检测申请内存是否成功 */ if (*text==0) return 0; Bfile_ReadFile (file_handle,*text,len,0); Bfile_CloseFile(file_handle); (*text)[len] = '\0'; return 1; }
{
ຫໍສະໝຸດ Baidu
int
file_handle;
int
len;
FONTCHARACTER font_file_name[32]; char_to_font ("\\\\crd0\\test.txt",font_file_name); file_handle = Bfile_OpenFile (font_file_name,_OPENMODE_READ); /* 检测文件是否创建成功 失败时返回值小于零 */ if (file_handle<0)
下面结合一个几个实例片段来看一下什么是文件操作(会使用 char_to_font 函数):
ASCII 文本写入(需要包含<string.h>):
int create_and_write_file () {
FONTCHARACTER font_file_name[32]; char * text = "Hello 9860 SDK!"; int len = strlen(text),file_handle; char_to_font ("\\\ \crd0\\test.txt",font_file_name); /* 检测文件是否创建成功 失败时返回值小于零 */ if (Bfile_CreateFile(font_file_name,len+1)<0){
int i,len = strlen(cFileName); for(i=0; i<len ;++i)
fFileName[i] = cFileName[i]; fFileName[i]=0; return fFileName; }
这样我们就可以使用这样的方法创建 FONTCHARACTER 文件名:
相关文档
最新文档