幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3696|回复: 0

Genie-03-文件、控制台和字符处理

[复制链接]

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2010-1-23 21:57:16 | 显示全部楼层 |阅读模式
Glib里只用了一个FileStream类来处理文件和控制台的两种操作,因此具体的操作方法都是差不多的。

FileStream类中
有一个常量EOF,这个很简单,文件结束的标识
类里有两个静态的方法:
fdopen(fildes:int, mode:string):FileStream?
open(path:string, mode:string):FileStream?
常用的方法,看到了这么眼熟的名字就基本就差不多了解用法了。
printf(format:string,...)
putc(c:char)
puts(s:string)
getc():int
gets(s:array of char):string
eof():bool
scanf(format:string,...):int
seek(offset:long, whence:FileSeek):int
tell():long
rewind()
对于开源软件,通常都会有个中文目录&中文件名的问题。
可以用GLib.Win32.locale_filename_from_utf8(utf8filename:string):string
转成换成本地的,综合起来的例子:
  1. init
  2.     var f = FileStream.open(Win32.locale_filename_from_utf8("./例子/测试.txt"),"a+")
  3.     if f != null
  4.         l:string = ""
  5.         while l != null
  6.             l = f.read_line()
  7.             print l
  8.     else
  9.         print "打开文件失败!"
复制代码
更简单的写法:
  1. inline def to_locale(s:string):string
  2.     return Win32.locale_filename_from_utf8(s)
复制代码


GLib为操作控制台特别从FileStream实例化了两个专用的对象stdin和stdout,这样使用起来就简单多了。
  1. init
  2.     var a = new array of char[256]
  3.     stdout.printf(stdin.gets(a))
复制代码
关于控制台显示中文的问题。
如果在代码里写上非E文的东西,就要把源代码存为utf-8格式的。
特别要注意的是要“无签名”的utf-8,编译器会把UTF-8的签名也当成是字符而报错。
  1. print "测试"
复制代码
直接就可以显示了。
这里有个问题。一开始装好vala-0.7.9的时候,显示出来的文字全是utf-8的,在win的gbk控制台下自然是乱码。所以我都是用GLib.convert(str:string,len:long, to_codeset:string, from_codeset:string, out bytes_read:int, out bytes_written:int):string手动转码的。
  1. def toGBK(utf8:string):string
  2.     gbk:string = utf8
  3.     try
  4.         GLib.convert(gbk, utf8.length, "GBK", "UTF-8", null, null)
  5.     except ex:GLib.ConvertError
  6.         print ex.message
  7.     return gbk
复制代码
后来用了GLib.Win32中的几个函数后,忽然print这样的函数,可以自动正确的输出中文了...
太莫名其妙了...
我猜可能是和用过GLib.Win32.getlocale():string这个函数有关吧。GLib库可能用什么方式记下这个结果。

中文的问题解决了,下面字符串的处理就没什么太好看的了。string本身就是utf-8的,只要注意处理输入和输出结果编码问题,就差不多了吧。
string有个属性length,用来保存字符串的长度。
string还有很多的方法,像split,replace,reverse,strip,concat,locale_to_utf8,to_int...
都是很常见的名字和用法,我懒了。具体的用法可以去glib-2.0.vapi文件里查,当然也可以去查http://references.valadoc.org/glib-2.0/

字符处理还有个很重要的东西:正则表达式,这个东西自然GLib里也有,GLib.Regex类,是常见的perl风格的。
  1. init
  2.     try
  3.         var s = "abc123def"
  4.         var r = new Regex("[0-9]+")
  5.         if r.match(s) do print "find"
  6.     except e:RegexError
  7.         print e.message
复制代码
え~え~お!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-28 16:51 , Processed in 0.021861 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表