- 注册时间
- 2004-11-1
- 最后登录
- 2018-4-24
版主
  
- 积分
- 548
|
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[256]
-     stdout.printf(stdin.gets(a))
复制代码 关于控制台显示中文的问题。
如果在代码里写上非E文的东西,就要把源代码存为utf-8格式的。
特别要注意的是要“无签名”的utf-8,编译器会把UTF-8的签名也当成是字符而报错。直接就可以显示了。
这里有个问题。一开始装好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("[0-9]+")
-         if r.match(s) do print "find"
-     except e:RegexError
-         print e.message
复制代码 |
|