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

C++ C++;如何复制文件*指针,c++,c,linux,C++,C,Linux,我在这里找到了解决办法 但是根据, 由dup创建的新文件描述符,它们引用相同的打开文件描述符,因此共享状态。那不是我想要的。我想创建一个全新的IO对象,它引用旧的文件* 有没有办法做到这一点 加: 实际上我没有文件名。我正在做一个对象的深度复制,它包含一个打开的文件指针,所以我也必须复制它 我想创建一个全新的IO对象,它引用旧的文件* 您假设与原始文件*关联的文件具有某种形式的标识,不同于访问它的IO对象。对于常规文件和其他一些对象,这是正确的,但对于其他对象,如套接字和管道,则是错误的。因此,

我在这里找到了解决办法

但是根据, 由dup创建的新文件描述符,它们引用相同的打开文件描述符,因此共享状态。那不是我想要的。我想创建一个全新的IO对象,它引用旧的
文件*

有没有办法做到这一点

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

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

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

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


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

您可以简单地打开文件两次(仅用于读取)?您需要它做什么?这是一个文件吗?只需打开文件两次。@WeatherVane我实际上没有文件名……我正在对一个对象进行深度复制,而该对象持有一个打开的文件指针,因此我必须复制该文件,以获得解决方案!readlink方法是我以前考虑过的,正如您所说,它只适用于linux,但我希望我的程序也能在其他平台上运行,所以我正在考虑一些更好的方法。但似乎没有更好的方法可以做到这一点……也许我应该保留一个文件名的记录,然后打开另一个
文件*
filename@ZiqiLiu,我不清楚拥有一个独立的
文件*
有什么作用,但是,如果您确实需要一个,那么我的建议是跟踪文件名以便能够再次打开它。
FILE *fp2 = fdopen (dup (fileno (fp)), "r");