shawind 发表于 2010-1-23 21:57:16

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

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
转成换成本地的,综合起来的例子:

init
    var f = FileStream.open(Win32.locale_filename_from_utf8("./例子/测试.txt"),"a+")
    if f != null
        l:string = ""
        while l != null
            l = f.read_line()
            print l
    else
        print "打开文件失败!"

更简单的写法:

inline def to_locale(s:string):string
    return Win32.locale_filename_from_utf8(s)



GLib为操作控制台特别从FileStream实例化了两个专用的对象stdin和stdout,这样使用起来就简单多了。

init
    var a = new array of char
    stdout.printf(stdin.gets(a))

关于控制台显示中文的问题。
如果在代码里写上非E文的东西,就要把源代码存为utf-8格式的。
特别要注意的是要“无签名”的utf-8,编译器会把UTF-8的签名也当成是字符而报错。
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手动转码的。

def toGBK(utf8:string):string
    gbk:string = utf8
    try
        GLib.convert(gbk, utf8.length, "GBK", "UTF-8", null, null)
    except ex:GLib.ConvertError
        print ex.message
    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风格的。

init
    try
        var s = "abc123def"
        var r = new Regex("+")
        if r.match(s) do print "find"
    except e:RegexError
        print e.message
页: [1]
查看完整版本: Genie-03-文件、控制台和字符处理