以字符串形式读取整个文件内容
Read entire file contents as a string
Genie 中如何将整个文件内容读入字符串变量?
(我在文档中找不到任何内容。文档似乎也分散且不完整。)
Genie 语言本身没有内置文件 input/output。您将需要使用一个库,这也是文档出现在很多地方的部分原因。有很多选择!
作为一般规则,像这样的低级功能的良好起点是 GLib library. Genie makes heavy use of GLib for its type system and includes the bindings to the GLib library by default. So here is an example using 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 的:
- 使用
var
关键字进行类型推断
- 一个
out
参数contents_of_file
- 通过在
try...except
块外声明 contents_of_file
来定义范围规则
- 字符串模板,用于调用变量的
to_string()
方法的@""
语法
GLib 库包含一个附加组件 GIO,它提供异步 input/output 和基于流的 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
是缓冲区和 load_contents ()
的 out
参数
-
valac
的 -X -w
选项抑制了来自 C 编译器的警告,即 guint8
在预期 char
时被传递
- 缓冲区需要转换为字符串:
(string)contents_of_file
- 如果您正在使用
GLib.Mainloop
或派生循环,您可以让 GIO 在后台线程中加载文件:file_loaded = yield file.load_contents_async( null, out contents_of_file, null )
- 如果你到了编写库绑定的地步,那么
null
参数可以被赋予默认值 null
,因此它们成为可选的,但该技术未在GIO 绑定
最后,可能还有其他库更适合您的需要。例如Posix.FILE是另一种读写文件的方式。
Genie 中如何将整个文件内容读入字符串变量?
(我在文档中找不到任何内容。文档似乎也分散且不完整。)
Genie 语言本身没有内置文件 input/output。您将需要使用一个库,这也是文档出现在很多地方的部分原因。有很多选择!
作为一般规则,像这样的低级功能的良好起点是 GLib library. Genie makes heavy use of GLib for its type system and includes the bindings to the GLib library by default. So here is an example using 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 的:
- 使用
var
关键字进行类型推断 - 一个
out
参数contents_of_file
- 通过在
try...except
块外声明contents_of_file
来定义范围规则 - 字符串模板,用于调用变量的
to_string()
方法的@""
语法
GLib 库包含一个附加组件 GIO,它提供异步 input/output 和基于流的 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
是缓冲区和load_contents ()
的 -
valac
的-X -w
选项抑制了来自 C 编译器的警告,即guint8
在预期char
时被传递
- 缓冲区需要转换为字符串:
(string)contents_of_file
- 如果您正在使用
GLib.Mainloop
或派生循环,您可以让 GIO 在后台线程中加载文件:file_loaded = yield file.load_contents_async( null, out contents_of_file, null )
- 如果你到了编写库绑定的地步,那么
null
参数可以被赋予默认值null
,因此它们成为可选的,但该技术未在GIO 绑定
out
参数
最后,可能还有其他库更适合您的需要。例如Posix.FILE是另一种读写文件的方式。