为什么 filestream.close 不可用

Why filestream.close not available

提问人:rnso 提问时间:10/1/2022 最后编辑:rnso 更新时间:10/6/2022 访问量:139

问:

在此 Vala 文档页面上看到以下代码示例:

public static int main (string[] args) {
    // Opens "foo.txt" for reading ("r")
    FileStream stream = FileStream.open ("foo.txt", "r");
    assert (stream != null);

    // buffered:
    char buf[100];
    while (stream.gets (buf) != null) {
        print ((string) buf);
    }

    return 0;
}

但是,我找不到函数。我想打开一次文件进行阅读,稍后再次打开文件进行写入。在没有关闭的情况下这样做是否安全?close()

(我不想使用允许读取和写入的 etc 模式,因为在运行应用程序时可能不需要两者。a+

文件 fopen filestream vala fclose

评论


答:

1赞 avojak 10/5/2022 #1

有两个关键项目在起作用:

  1. 该类是与标准 C 库函数(例如 for 、 for 等)。(请参阅:此 Stack Overflow 答案,了解各种文件 API 的良好概述)FileStreamopenfopenreadfread
  2. Vala 进行自动引用计数,并为您释放对象(参见:Vala 的内存管理解释)。

现在,如果我们查看 FileStream Vala 绑定的定义,我们会看到:

[ CCode ( cname = "FILE" , free_function = "fclose" ) ]
public class FileStream

请注意该部分。这意味着当 Vala 释放对象时,它将隐式调用 .因此,无需手动尝试此操作。(另请参阅:在“定义类”部分下编写 VAPI 文件,了解以下详细信息free_function = "fclose"FileStreamfclosefree_function)

这对你来说意味着,一旦你的对象超出范围,引用计数达到 0,等等,它就会像你对任何其他对象所期望的那样为你清理。您可以通过使用和获取新对象安全地打开文件以供以后再次读取。streamFileStream.openFileStream

评论

0赞 rnso 10/6/2022
解释得很好。因此,一旦超出范围,它就会关闭。因此,如果我尝试在主函数本身中再次打开“foo.txt”文件(现在处于“a+”模式),会出现错误吗?或者文件会自动关闭并以新模式重新打开?
0赞 avojak 10/6/2022
@rnso 这是一个很好的问题,我不是 100% 确定它会如何表现。由于它最终会调用 C 库函数,我认为可以肯定地说,如果这是用 C 编写的,它的行为与不调用 close 相同。多次打开文件进行阅读应该是安全的,但显然您需要小心写入。冒着成为 Stack Overflow 上的“那个人”的风险,我个人使用 GLib.FileInputStream 和 FileOutputStream API 进行文件操作,因为我认为界面更清晰一些。