以字符串形式读取整个文件内容

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是另一种读写文件的方式。