C 附加到全局文件句柄,这是错误的吗?

C 附加到全局文件句柄,这是错误的吗?,c,filehandle,C,Filehandle,假设我的程序中有多个函数需要将数据附加到某个文件中。我使用全局文件句柄在程序开始时打开该文件,以便可以在需要时附加到该文件。(注意,我知道我可以将文件句柄作为参数传递给函数,但这不是本问题的目的)。在程序开始时打开文件句柄,然后在程序结束时关闭它是否不好;或者最好有一个函数,比如说void AppendFile(char*data\u to\u append)然后打开文件并附加到其中,然后在同一个函数中关闭它?如果程序死掉,FD仍然在使用是我看到的唯一一件坏事,但同时,如果使用该功能,您会成百上

假设我的程序中有多个函数需要将数据附加到某个文件中。我使用全局文件句柄在程序开始时打开该文件,以便可以在需要时附加到该文件。(注意,我知道我可以将文件句柄作为参数传递给函数,但这不是本问题的目的)。在程序开始时打开文件句柄,然后在程序结束时关闭它是否不好;或者最好有一个函数,比如说
void AppendFile(char*data\u to\u append)
然后打开文件并附加到其中,然后在同一个函数中关闭它?如果程序死掉,FD仍然在使用是我看到的唯一一件坏事,但同时,如果使用该功能,您会成百上千次地打开和关闭同一文件。

您可能最好执行一次打开和一次关闭。不停地打开/关闭将导致大量IOs浪费

您可能希望通过互斥来保护此函数,以便一次只能有一个线程写入文件句柄

请务必最终关闭您的文件。

是的


这不是最有用的答案,但我担心你的问题过于笼统和模糊,无法给你提供任何详细的信息。如果您的程序中分散了对该FD的访问,则表明您的高级设计有问题。这些单独的访问是否以某种方式相互关联?它们是否可以合并为访问文件的少量点?您的程序中是否有某种隐含的数据结构可以更好地在类中实现?

如果您的程序是单线程的,那么就可以了。如果它在文件句柄打开时死亡,操作系统可能会关闭它。如果不是,如何保证它不会在AppendFile函数中消亡


我建议你做一个AppendFile函数。它将简化写入过程,并且您可以比随意使用fwrite()更轻松地更改文件句柄。

取决于您对文件不被破坏或丢失数据的关注程度。如果程序崩溃,无法保证所有尚未完成的写入(不仅完成,还刷新并提交到磁盘)会发生什么情况。如果存在未提交的写入,则可能会将其丢弃或完成一半。关闭文件可以保证这些写入操作得到提交

如果写操作不频繁,那么在我看来,打开/追加/关闭是一个更好的主意——但是
AppendFile
可以使其与已经打开的文件句柄一起工作,因此实际上无论哪种方式都能更好地工作


此外,如果您使用线程,您不希望对文件进行随机写入—您希望有某种方法来同步它们。拥有一个
AppendFile
或类似的函数可以为您提供同步点——您可以在其中添加代码以等待另一个线程完成。当您在一百个不同的位置直接写入文件时,请尝试这样做。

有时数据库是文本文件的一个很好的替代品,特别是当数据库最初专门设计用于替换文本文件时:)

看看SQLite()

SQLite不是Oracle的替代品,而是fopen()的替代品


如果您所说的文件句柄是指一个
文件*
,那么在开始时打开,在结束时关闭,并且有大量用户,即使有多个线程,只要您在POSIX系统上使用单个stdio函数调用进行写操作,也应能正常工作


如果文件句柄指的是操作系统的open调用返回的整数,那么在对
write
(或类似)的单个调用中,这些通常是线程安全的,因为操作系统将在将数据传输到与该文件相关联的缓冲区时锁定该文件

如果程序是一个单线程应用程序,那么您不必担心任何一种方法

如果你反复地打开,附加,如果将stdio的
文件*
与多个线程一起使用,或者由于不同的
文件*
不会在应用程序内共享缓冲区,而在一个线程中更改的文件可能会被其他线程覆盖,因此对
AppendFile
的调用以某种方式递归进行,那么关闭该文件可能会遇到问题变化

os文件句柄(open返回的整数)也会发生类似的情况,因为对
open
的不同调用将产生不同的文件句柄,而不会共享它们的查找位置,因此,随着文件的增长,不同的文件描述符将以查找位置结束,而这些位置实际上并不在文件的末尾,除非您可以在仅附加模式(
O_append
)下打开文件,操作系统将在该模式下为您处理此问题


反复打开和关闭文件都会产生大量额外的工作。

全局变量通常不是一件好事。但对于小程序来说,这并不重要

仍然使用全局文件句柄,考虑仅通过<代码>空隙附件文件(char * DATAXtox附件)访问它;<代码>函数,其中只有

AppendFile
引用全局文件,而不是将其分散在代码中

如果经常访问某个文件,每次访问时打开/关闭该文件可能会非常困难


此外,当程序结束时,文件句柄通常是关闭的(或者死亡,或者正常退出),因此如果程序崩溃,您不会泄漏任何内容。

Whoah,类?标签上写着C.在我回答时没有发现/它不在那里。我会留下评论,因为每个人都知道,如果你足够坚定,缺乏正常的理智界限,C不会阻止你去做OO…append/flush/append/flush会给你一个很好的保证,东西会被写出来。如果有人记得刷新。哪个