如何在Genie中将整个文件内容读入字符串变量?
(我在文档中找不到任何内容。文档似乎也分散且不完整。)
答案 0 :(得分:4)
Genie语言本身没有内置文件输入/输出。您将需要使用库,这也是文档在很多地方的部分原因。有很多选择!
作为一般规则,像这样的低级功能的良好起点是GLib library。 Genie大量使用GLib作为其类型系统,并默认包含GLib库的绑定。以下是使用GLib's FileUtils的示例:
[indent=4]
init
var filename = "test.txt"
file_loaded:bool = false
contents_of_file:string
try
file_loaded = FileUtils.get_contents( filename, out contents_of_file )
except error:FileError
print( error.message )
if file_loaded
print( @"Contents of $filename:
$contents_of_file")
编译:
valac fileutils_example.gs
这个例子使用了Genie's:
var
keywod out
参数contents_of_file
contents_of_file
块try...except
来确定范围规则
@""
方法的to_string()
语法GLib库包含一个额外的组件GIO,它提供异步输入/输出和基于流的API。下一个示例是一个非常基本的示例,与上面相同,但使用GIO接口:
[indent=4]
init
var file = File.new_for_path( "test.txt" )
file_loaded:bool = false
contents_of_file:array of uint8
try
file_loaded = file.load_contents( null, out contents_of_file, null )
except error:Error
print( error.message )
if file_loaded
text:string = (string)contents_of_file
print( @"Contents of $(file.get_basename()):
$text")
编译:
valac --pkg gio-2.0 -X -w fileinputstream_example.gs
需要注意的是:
--pkg gio-2.0
使用GIO库,前面的示例中不需要--pkg glib-2.0
,因为默认情况下已完成contents_of_file:array of uint8
是out
load_contents ()
参数
-X -w
的{{1}}选项会阻止来自C编译器的警告valac
正在预期guint8
char
(string)contents_of_file
或派生循环,您可以让GIO在后台线程中加载文件:GLib.Mainloop
file_loaded = yield file.load_contents_async( null, out contents_of_file, null )
参数可以被赋予默认值null
,所以它们变成可选的,但是这个技术没有在GIO中使用绑定最后,可能还有其他库可以更好地满足您的需求。例如,Posix.FILE是另一种读取和写入文件的方式。