C++如何复制文件 * 指针

C++ how to copy a FILE * pointer

本文关键字:文件 指针 复制 何复制 C++      更新时间:2023-10-16

我在这里找到了解决方案 复制文件指针?

FILE *fp2 = fdopen (dup (fileno (fp)), "r");

但根据 http://man7.org/linux/man-pages/man2/dup.2.html,dup创建的新文件描述符,它们引用相同的打开文件描述符,从而共享状态。那不是我想要的。我想创建一个全新的IO对象,它引用旧FILE *指向的文件

有什么办法可以做到这一点吗?

加: 我实际上没有文件名。我正在对一个对象进行深度复制,其中包含一个打开的 FILE 指针,所以我也必须复制它。

我想创建一个全新的 IO 对象,它引用旧FILE *指向的文件

假设与原始FILE *关联的文件具有某种形式的标识,该标识不同于访问它的 IO 对象。 对于常规文件和某些其他对象,这是正确的,但对于其他对象(如套接字和管道)是错误的。 因此,没有通用机制可以执行您的要求。

对于可以通过文件系统访问的对象的特殊情况,创建与同一文件关联的新 IO 对象的方法是通过文件的路径open()fopen()文件。 这就是这些函数的作用。 没有标准方法可以从FILE *或文件描述符编号中获取路径,但是在Linux上(因为您标记了该),您可以在/proc中打开的文件条目上使用readlink(),如此处所述。

请注意,即使对于常规文件,也不能保证readlink方法有效。 特别是,如果打开原始文件的路径已被取消链接,则它将无法工作,实际上,在这种情况下,它可能会导致打开错误的文件。 您可以通过在旧文件描述符和新文件描述符编号上运行fstat()来检查这一点 - 如果文件实际上相同,则它们将在同一主机设备上具有相同的索引节点编号。