提问人:rnso 提问时间:10/1/2022 最后编辑:rnso 更新时间:10/6/2022 访问量:139
为什么 filestream.close 不可用
Why filestream.close not available
问:
我在此 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+
答:
1赞
avojak
10/5/2022
#1
有两个关键项目在起作用:
- 该类是与标准 C 库函数(例如 for 、 for 等)。(请参阅:此 Stack Overflow 答案,了解各种文件 API 的良好概述)
FileStream
open
fopen
read
fread
- Vala 进行自动引用计数,并为您释放对象(参见:Vala 的内存管理解释)。
现在,如果我们查看 FileStream Vala 绑定的定义,我们会看到:
[ CCode ( cname = "FILE" , free_function = "fclose" ) ]
public class FileStream
请注意该部分。这意味着当 Vala 释放对象时,它将隐式调用 .因此,无需手动尝试此操作。(另请参阅:在“定义类”部分下编写 VAPI 文件,了解以下详细信息free_function = "fclose"
FileStream
fclose
free_function
)
这对你来说意味着,一旦你的对象超出范围,引用计数达到 0,等等,它就会像你对任何其他对象所期望的那样为你清理。您可以通过使用和获取新对象安全地打开文件以供以后再次读取。stream
FileStream.open
FileStream
评论
0赞
rnso
10/6/2022
解释得很好。因此,一旦超出范围,它就会关闭。因此,如果我尝试在主函数本身中再次打开“foo.txt”文件(现在处于“a+”模式),会出现错误吗?或者文件会自动关闭并以新模式重新打开?
0赞
avojak
10/6/2022
@rnso 这是一个很好的问题,我不是 100% 确定它会如何表现。由于它最终会调用 C 库函数,我认为可以肯定地说,如果这是用 C 编写的,它的行为与不调用 close 相同。多次打开文件进行阅读应该是安全的,但显然您需要小心写入。冒着成为 Stack Overflow 上的“那个人”的风险,我个人使用 GLib.FileInputStream 和 FileOutputStream API 进行文件操作,因为我认为界面更清晰一些。
评论