【问题标题】:Cannot open file with relative path? (C++ ifstream)无法使用相对路径打开文件? (C++ ifstream)
【发布时间】:2015-04-04 00:59:43
【问题描述】:

我知道这似乎是一个简单的问题,但我尝试了所有我能想到的方法,但对于原本不应该成为问题的事情却无济于事。

这是一个打开文件的小型 C++ 程序。当我用它的绝对文件路径打开它时,它工作正常。但是,对于相对路径,它会停止工作。

这是程序的文件路径和我要读取的文件:

C++ 程序: "/Users/Baggio/C++/Lab0/Lab0/Lab0/main.cpp"

文件: /Users/Baggio/C++/Lab0/Lab0/Lab0/result.txt, /Users/Baggio/C++/Lab0/Lab0/Lab0/dict.txt

这里是代码 sn-p:

#include <iostream>
#include <fstream>
#include <iomanip> 
#include <string> 
#include <cstdlib> 
using namespace std;

int main(int argc, const char * argv[]) {

//    string dict_filename = "/Users/Baggio/C++/Lab0/Lab0/Lab0/dict.txt";
//    string result_filename = "/Users/Baggio/C++/Lab0/Lab0/Lab0/result.txt";

    string dict_filename_string = "dict.txt";
    string result_filename_string = "result.txt";

    const char* dict_filename = dict_filename_string.c_str();
    const char* result_filename = result_filename_string.c_str();

    //  open files
    ifstream dict_file(dict_filename, ifstream::in);
    ifstream result_file(result_filename, ifstream::in);

    if (!dict_file || !result_file) {
        cerr << "File could not be opened." << endl;
        exit(1);
    }
}

执行结果

File could not be opened.

我确信我已经正确地完成了所有的包含,以及 ifstream 构造函数参数的数据类型。我能想到的唯一值得一提的是我使用的系统:我在 Mac 上,我使用 XCode6 作为我的 IDE。

另外,我尝试将文件的位置(results.txt 和 dict.txt)移动到这些位置,但无济于事:

/Users/Baggio/C++/Lab0/Lab0/Lab0/

/Users/Baggio/C++/Lab0/Lab0/

/Users/Baggio/C++/Lab0/

/Users/Baggio/C++/

谢谢你们的帮助!!任何建议或想法表示赞赏。

【问题讨论】:

  • 是的,没错!错字错了... -__-"
  • 我会添加 xcode 标签,因为我认为这可能是问题所在 - 程序运行的路径可能不是源文件位置。您也可以尝试让文件路径字符串类似于“./dict.txt”。
  • 是的,我也试过了,但没用。
  • 嗯,你可以尝试一个函数来创建一个文件,指定一个相对路径,如果成功,搜索文件的创建位置?

标签: c++ xcode xcode6 relative-path ifstream


【解决方案1】:

运行程序时打印出你当前的工作目录:

char buffer[256];
char *val = getcwd(buffer, sizeof(buffer));
if (val) {
    std::cout << buffer << std::endl;
}

这将告诉您从哪里运行程序,以及为什么路径与相对路径不匹配。相对路径是相对于当前工作目录的,不是相对于你的二进制文件所在的位置。

如果你想让路径相对于二进制文件的位置,那么你必须自己做。许多编程语言都提供此选项,但它不是 C++ 内置的。您可以通过使用来自mainargv[0] 查找可执行文件来执行此操作。然后你需要把可执行路径的文件组件去掉,替换成你感兴趣的文件名。

从 C++17 开始,您可以使用 std::filesystem::current_path() 代替 getcwd

std::cout << std::filesystem::current_path() << std::endl;

【讨论】:

  • 我明白了——这就是问题所在。它打印了/Users/Baggio/C++/Lab0/Lab0/Lab0/Lab0/Build/Products/Debug - 似乎是 XCode 特有的问题。我现在正在研究如何在 XCode 中更改它。感谢您的建议!
  • 如何在带有 VSC 的 WIndows 10 中使用 getcwd ?因为现在我得到的只是:identifier "getcwd" is undefinedC/C++(20)
  • getcwd 是一个 POSIX 函数。对于标准 C++,您可以使用自 C++17 起在 &lt;filesystem&gt; 标头中定义的 std::filesystem::current_path
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
相关资源
最近更新 更多