【问题标题】:C++ how to copy a FILE * pointerC++如何复制一个FILE *指针
【发布时间】:2019-04-04 19:26:09
【问题描述】:

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

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

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

有什么办法吗?

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

【问题讨论】:

  • 你能简单地打开文件两次(只读)吗?
  • 你需要这个做什么?这是XY problem吗?
  • 只需打开文件两次。
  • @WeatherVane 我实际上没有文件名....我正在对一个对象进行深层复制,并且该对象持有一个打开的 FILE 指针,所以我也必须复制它

标签: c++ c linux


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的解决方案! readlink 方法是我之前考虑过的,正如你所说,它只适用于 linux,但我希望我的程序也可以在其他平台上运行,所以我正在考虑一些更好的方法。但似乎没有更好的方法可以做到这一点......也许我应该只记录文件名并通过该文件名打开另一个FILE *
  • @ZiqiLiu,我不清楚拥有一个独立的FILE * 的目的是什么,但如果你确实需要一个,那么跟踪文件名以便能够打开它再次肯定会是我的建议。
猜你喜欢
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
相关资源
最近更新 更多