【发布时间】:2017-10-31 08:18:31
【问题描述】:
我只是想了解如何从动态位置使用 fopen() 函数打开文件。我的意思是,例如它将是一个系统文件,而在另一台计算机中,该文件可以位于另一个位置。因此,如果我不动态地在我的代码中设置我的位置,我的程序将无法在另一台计算机上运行。那么如何才能为我的程序动态设置位置,无论它在哪里都能找到这个文件呢?
【问题讨论】:
-
不是位置,而是文件路径。请参阅我的答案以获取链接。
我只是想了解如何从动态位置使用 fopen() 函数打开文件。我的意思是,例如它将是一个系统文件,而在另一台计算机中,该文件可以位于另一个位置。因此,如果我不动态地在我的代码中设置我的位置,我的程序将无法在另一台计算机上运行。那么如何才能为我的程序动态设置位置,无论它在哪里都能找到这个文件呢?
【问题讨论】:
您可以(并且通常应该)通过您的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)的源代码以获得灵感。
【讨论】:
我建议您使用环境变量,在 PC 中将您的文件位置设置为环境变量。然后读取程序中的环境变量值,然后打开文件。这个想法在linux和windows中都适用,但是你已经采用了基于操作系统的代码来读取环境变量。
【讨论】:
getenv 适用于 Linux、Windows、MacOSX、Android 等。
main 的程序参数(这几乎是C 标准本身所要求的)。顺便说一句,运行 Linux 的 PC 仍然是 PC。
除了在运行时通过命令行参数、环境变量或配置文件指定文件位置外,您还可以实现类似 PATH 的逻辑:
文件的可能位置在环境变量中设置:
export MY_FILE_PATH=/usr/bin:/bin:/opt/bin:$HOME/bin
您的程序读取该环境变量,解析其内容并检查每个指定路径中的文件是否存在,并返回fopen() 状态。
【讨论】: