【问题标题】:Why filestream.close not available为什么 filestream.close 不可用
【发布时间】:2022-10-05 23:12:21
【问题描述】:
我在this Vala documentation page 上看到以下代码示例:
public static int main (string[] args) {
// Opens \"foo.txt\" for reading (\"r\")
FileStream stream = FileStream.open (\"filestream.vala\", \"r\");
assert (stream != null);
// buffered:
char buf[100];
while (stream.gets (buf) != null) {
print ((string) buf);
}
return 0;
}
但是,我找不到close() 函数。我想打开文件一次读取,然后再打开一次写入。在没有中间间隔的情况下这样做是否安全?
(我不想使用a+ 等允许读取和写入的模式,因为在运行应用程序时可能不需要两者。)
标签:
file
fopen
filestream
vala
fclose
【解决方案1】:
有两个关键项目在起作用:
-
FileStream 类是对标准 C 库函数的绑定(例如,open 用于 fopen,read 用于 fread 等)。 (请参阅:this Stack Overflow answer 以获得对各种文件 API 的全面了解)
- Vala 会自动进行引用计数并为您释放对象(请参阅:Vala's Memory Management Explained)。
现在,如果我们查看 FileStream Vala 绑定的定义,我们会看到:
[ CCode ( cname = "FILE" , free_function = "fclose" ) ]
public class FileStream
注意free_function = "fclose" 部分。这意味着当 Vala 释放 FileStream 对象时,它会隐式调用 fclose。因此无需手动尝试。 (有关free_function 的详细信息,另请参阅:定义类部分下的Writing VAPI files)
这对您意味着,一旦您的 stream 对象超出范围,引用计数达到 0 等,它将像您期望的任何其他对象一样为您清理。您可以通过使用FileStream.open 并获取新的FileStream 对象来安全地打开文件以供稍后再次阅读。