gpt4 book ai didi

C++ 如何复制 FILE * 指针

转载 作者:太空狗 更新时间:2023-10-29 11:40:29 24 4
gpt4 key购买 nike

我在这里找到了解决方案Duplicating file pointers?

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

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

指向的文件

有什么办法吗?

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

最佳答案

I want to create a totally new IO object which refers to the file pointed by the old FILE *

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

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

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

关于C++ 如何复制 FILE * 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55523554/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com