【问题标题】:fopen file from same directory in c language without using the full path用c语言从同一目录打开文件而不使用完整路径
【发布时间】:2012-11-29 03:05:52
【问题描述】:

我正在尝试执行以下操作:

FILE *fileNAME = fopen("file.txt", "r");

当我有的时候它可以工作:

FILE *fileNAME = fopen("users/username/desktop/folder/file.txt", "r");

但是因为我想在我的家用计算机之外使用这个文件,所以路径应该是相对的,尤其是对于无法访问实际源代码的最终用户。我的问题是,如何实际完成这项工作,如果问题是由于编译器默认没有使用正确的目录,我该如何更改? (我正在使用 XCODE)

【问题讨论】:

  • 这些都不是绝对路径。
  • 随意编辑技术问题,但问题仍然存在......你能帮我吗?
  • @user1883003 这甚至不是一个适当的问题,如果没有适当的信息,我们无法编辑“技术”(因为真的,你在这里求个忙,那是你的工作)。你在用什么xcode?这甚至与您的问题有什么关系?你在使用什么库?开源跨平台C命令行工具?请提供信息。
  • 我正在使用#include 、#include 、#include 。如果有帮助,我将编辑为完整路径,并且我正在使用最新版本的 xcode 及其自己的编译器、自己的命令窗口和 lldb。
  • @user1883003 在 *nix 类型系统上(如果您使用 XCode,这是一个安全的假设),完整路径总是以“/”开头。无论那种“技术性”(欢迎编程,精确或在其他地方),您遇到什么错误,并且“file.txt”是否存在于您的当前目录中?如果它存在并且如果您对该文件具有读取权限,则如图所示您的相对路径调用将成功。

标签: c xcode file directory fopen


【解决方案1】:

您可以在通过命令调用程序时将文件路径作为输入参数传递

$myprogram users/username/desktop/folder/file.txt

在您的代码源中,您可以从 argv 获取此路径

int main (int argc, char **argv)
{
   char *file_path = argv[1];
   ....
} 

argc 是 argv 数组的长度。因此,如果数组长度小于 2,则程序应返回帮助消息以指示用户输入文件路径作为参数

int main (int argc, char **argv)
{
   char *file_path;
   if (argc <2) {
      printf("Usage: %s <file path>\n", argv[0]);
      exit(1);
   }
   file_path = argv[1];
   ....
} 

【讨论】:

  • 确实,argc 是 argv 数组的长度。因此,如果数组长度小于 2,则程序应返回帮助消息以指示用户输入文件路径作为参数。答案已更新
【解决方案2】:

如果您使用的是 Mac OS X(Xcode,对,我不是 OS X 用户,但我认为是它?),您可以获取当前的可执行路径(不是当前的工作目录路径)

char path[1024];
uint32_t size = sizeof(path);
if (_NSGetExecutablePath(path, &size) == 0)
    printf("executable path is %s\n", path);
else
    printf("buffer too small; need size %u\n", size);

在这之后,你有两种方法:

1) 更新组合文件路径与 exe 目录(如sprintf(filepath, "%s/%s", path, "file.txt");

2) 使用chdir 函数更改当前目录并使用相对路径访问文件。

编辑:_NSGetExecutablePath 返回可执行路径,而不是可执行目录,因此使用substr/strrchr提取最后一次出现'/'之前的路径。

【讨论】:

  • 感谢您的详细解答!我试过了,我收到了一个很长的路径名:/users/username/library/developer/xcode/deriveddata/filename-laksdjlakdsjl(actual gibberish)/build/products/debug/filename
  • 这就是你的程序所在的位置(尝试在Finder中找到这个目录)。将程序移动到您的桌面,然后从终端启动它,它应该指向您的桌面文件夹。
  • 其实就是你的工作空间。您可以在 Product->Scheme->edit Scheme 下编辑当前目录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多