【问题标题】:Convert C file pointer address into Integer将C文件指针地址转换为Integer
【发布时间】:2015-03-10 23:35:41
【问题描述】:

我有一个 C 文件指针,我必须将它传递给 Fortran77 程序(作为整数),然后才能在 C 程序中再次使用(作为文件指针)将更多数据写入文本文件。我的 C 技能已经过时了,因为我已经忘记了大部分。谁能告诉我如何将 C FILE 指针转换为整数并返回?非常感谢您的帮助。

我正在维护一个旧代码,该代码在一个 10 年前的编译器中运行良好(偶然)。我在移植代码时遇到问题。新的编译器是 intel C 和 Fortran 编译器。

我知道 Fortran 2003 为 C 提供 ISO 绑定,但由于其他原因我不能在这里使用它们。

【问题讨论】:

  • 您是在寻找文件描述符,正如当前的两个答案所暗示的那样,还是只是将指针地址直接视为整数?
  • 如果是后者,你的平台上的指针和整数有多少字节?如果整数大到足以容纳该点,只需使用intptr_tuintptr_t 强制转换指针。
  • 机器是64位的。将指针地址视为整数也可以解决问题。当程序回到 C 时,我只需要一种方法来跟踪打开的文件。我不知道如何取回它。你能写下如何做到这一点作为答案吗?我愿意投票。
  • 完成。添加了讨论此方法的答案。

标签: c pointers


【解决方案1】:

FILE *int

int fildes = fileno(f);

intFILE *

FILE *f = fdopen(fildes, "r+");

【讨论】:

    【解决方案2】:
    1. 将文件指针转换为 int(文件描述符)

    int fileno(FILE *stream); 函数 fileno() 检查参数流并返回其整数描述符。

    2.将文件描述符转换为文件指针

    FILE *fdopen(int fildes, const char *mode); fdopen 函数将流与文件描述符相关联。

    【讨论】:

      【解决方案3】:

      我不确定执行fopen/fileno/fdopen 序列是否会像您期望的那样“保持文件打开”(正如当前标记的答案所暗示的那样)。或者这可能是平台相关的,所以你不能依赖它。

      要毫无疑问地做你想做的事,只需使用uintptr_t 将你的FILE * 分配给你的Fortran 代码(假设它可以处理你平台上的任何大小uintptr_t [您在 OP 的评论中说是 64 位]),然后当 Fortran 将其传回给您时,将您的 uintptr_t 分配/转换回您的 FILE *,并愉快地使用所有文件功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-31
        • 2022-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        相关资源
        最近更新 更多