【问题标题】:Read entire file contents as a string将整个文件内容作为字符串读取
【发布时间】:2017-03-22 22:54:16
【问题描述】:

如何将整个文件内容读入 Genie 中的字符串变量?

(我在文档中找不到任何内容。文档似乎也很分散且不完整。)

【问题讨论】:

  • 欢迎来到 SO。您能否提供一个最小的工作示例(MWE)?编写一些代码来显示您要实现的目标,这将提高回答您问题的机会。另外,请提及您查看的特定网站。祝你好运。
  • 似乎它对我们所有人都很有效,即使他没有听从你的警告。

标签: genie


【解决方案1】:

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 的:

  • 使用var 关键字进行类型推断
  • 一个out参数contents_of_file
  • 通过在 try...except 块外声明 contents_of_file 来界定规则
  • 字符串模板,@"" 语法,用于调用变量的 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 uint8load_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是另一种读写文件的方式。

【讨论】:

  • print( contents_of_file ) // 简单明了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多