【问题标题】:fopen() function with a dynamic location in C在 C 中具有动态位置的 fopen() 函数
【发布时间】:2017-10-31 08:18:31
【问题描述】:

我只是想了解如何从动态位置使用 fopen() 函数打开文件。我的意思是,例如它将是一个系统文件,而在另一台计算机中,该文件可以位于另一个位置。因此,如果我不动态地在我的代码中设置我的位置,我的程序将无法在另一台计算机上运行。那么如何才能为我的程序动态设置位置,无论它在哪里都能找到这个文件呢?

【问题讨论】:

  • 不是位置,而是文件路径。请参阅我的答案以获取链接。

标签: c file fopen


【解决方案1】:

您可以(并且通常应该)通过您的main 的常规int argc, char**argv formal arguments 将程序参数传递给您的main。另见this。

(我专注于 Linux,但您可以根据其他操作系统和平台调整我的答案)

因此,您将使用一些约定将该文件path(不是位置,该词通常指memory addresses)传递给您的程序(通常通过启动程序的命令行) .另见this answer。

您可以使用(至少在 Linux 上)getopt_long(3) 来解析程序参数。但是有other ways,可以显式处理main的参数。

您还可以使用一些environment variable 来传递该信息。您将使用getenv(3) 查询它。另请阅读environ(7)。

许多程序都有configuration files(其路径被连接到程序中,但通常可以由程序参数或环境变量给出)并且parsing它们可以找到相关的文件路径。

您甚至可以考虑使用其他inter-process communication 将文件路径传递给您的程序。毕竟,文件路径只是一些字符串(在path_resolution(7) 中解释了限制和解释)。有很多方法可以将一些数据传递给程序。

还可以阅读globbing,尤其是glob(7)。在 Unix 上,the shell is expanding the program arguments。您可能希望在其他地方(例如,在某些配置文件中)获得的东西上使用 glob(3) 或 wordexp(3) 之类的函数来获得类似的扩展。

顺便说一句,当使用fopen 时,一定要检查它是否失败。你可能会像here 一样使用perror。

还可以查看几个free software 项目(可能在github)的源代码以获得灵感。

【讨论】:

  • 替代方式是编译时定义和配置文件。不同的选项通常混合在专业级软件中。
【解决方案2】:

我建议您使用环境变量,在 PC 中将您的文件位置设置为环境变量。然后读取程序中的环境变量值,然后打开文件。这个想法在linux和windows中都适用,但是你已经采用了基于操作系统的代码来读取环境变量。

【讨论】:

  • 为什么你更喜欢环境变量而不是程序参数?
  • 为什么使用标准getenv的程序的源代码需要适应各种操作系统? getenv 适用于 Linux、Windows、MacOSX、Android 等。
  • 因为如果每次运行程序时它都是程序参数,那么您必须指定参数。使用环境变量使实现变得整洁。这就是标准 linux 实现中有多少程序访问文件。
  • 我不明白“实施整洁”的说法。所有操作系统都接受main 的程序参数(这几乎是C 标准本身所要求的)。顺便说一句,运行 Linux 的 PC 仍然是 PC。
【解决方案3】:

除了在运行时通过命令行参数、环境变量或配置文件指定文件位置外,您还可以实现类似 PATH 的逻辑:

  • 文件的可能位置在环境变量中设置:

    export MY_FILE_PATH=/usr/bin:/bin:/opt/bin:$HOME/bin
    
  • 您的程序读取该环境变量,解析其内容并检查每个指定路径中的文件是否存在,并返回fopen() 状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多