用c ++打开文件,相对还是绝对?

时间:2012-04-23 13:28:48

标签: c++ eclipse file directory

我正在尝试在大型代码中打开文件。

有人告诉我,在处理文件时,使用绝对路径而不是相对路径可能是更好的做法。但是这个代码将由不同的人使用,他们可能将源放在不同的地方(例如/ home / username,或/ home / username / desktop /),所以我认为使用相对路径可能更好访问我的配置文件,因为我知道它与我的cpp文件的关系。

以下是与我的问题相关的文件位置的简短总结:

  • 我想要阅读的文件是/home/me/myproject/config/myfile.txt

  • 我正在阅读的文件是/home/me/myproject/src/myfile.cpp

  • 包含'main'的文件也是/home/me/myproject/src/myfile.cpp(这个文件很大)。

我正在从eclipse启动可执行文件。我认为eclipse将工作目录设置为'main'所在的目录(/ home / me / myproject / src /)。

我很困惑的事实是,当我要调用file.open()时,工作目录(getcwd())现在是/ home / me / myproject /。显然工作目录是由main()和我对file.open()的调用之间的代码修改的。

我的问题是:如果可以通过程序的其他部分进行更改,那么依赖于工作目录似乎非常容易出错。另一方面,考虑到我不知道其他开发人员通常把他们的资源放在哪里,我怎么知道我的配置路径在哪里呢?

2 个答案:

答案 0 :(得分:2)

  

我正在从eclipse启动可执行文件。我认为eclipse设定了   工作目录到'main'所在的目录   (/家/我/ myproject的/ src目录/).

你确定吗?在我看来,它是项目文件夹的顶层(即“/ home / eclipse / myproject”,而不是“/ home / eclipse / src”。这可以解释原因:

  

工作目录(getcwd())现在是/ home / me / myproject /.

还有别的什么吗?它不太可能“被程序的另一部分改变”,除非你明确地做了一些事情来引起这种情况。

我不清楚您是否理解源代码可执行文件之间的区别。您的源代码文件未“运行”。它被编译成可执行文件,这就是运行的。使用eclipse,这些默认情况下放入Release /或Debug /(看看),而不是src /目录。 eclipse使用toplevel目录的(可推测的)原因是这些版本之间的一致性,因此你可以,例如,相对于那个输出。

  

我的问题是:看起来很容易依赖于工作   目录,

无论如何,这绝对是正确的。有特定于操作系统的方法来获取用户主目录的路径。您应该得到它,并在文档中指定要保留配置的位置。如果用户不能正确地做到这一点,那不是你的错 - 而是发出信息性的信息,例如。 “找不到配置文件!”。

  

我怎么知道我的配置路径在哪里   鉴于我不知道其他开发者通常放在哪里   他们的来源?

请注意,“其他开发者”根本不一定包含源,因为不需要运行可执行文件

答案 1 :(得分:-1)

接受文件位置作为参数总是一个好主意,因此使用您的软件的人可以毫不费力地尝试不同的配置。

您总能做的是弄清楚当前正在运行的二进制文件的位置。如果找不到直接方式,请使用getcwd()argv[0]的组合。如果进程没有自行更改,则在运行命令后,工作目录更改。

然后,您可以截断文件名并将配置文件的名称附加到路径(存储在以下示例中的字符串base中)。 以下是一些代码,用于确定路径是绝对路径还是相对路径,并相应地附加路径。您需要boost_filesystem才能实现跨平台:

#ifdef WITH_BOOST_FILESYSTEM
    boost::filesystem::path basepath(base), filepath(filename);
    if (!basepath.is_complete()) {
        basepath = filepath.remove_leaf() /= basepath;
        base = basepath.string();
    }
#elif __unix__
    if (base[0] != '/') {
        char *f = strdup(filename.c_str()), *d = dirname(f);
        base = string(d).append("/").append(base);
        free(f);
    }
#else
    std::cerr << "Warning: only absolute file paths accepted." << std::endl;
#endif
    base.append("/");