无法使用相对路径打开文件?(C++ ifstream)

Cod*_*ice 1 c++ xcode relative-path ifstream xcode6

我知道这似乎是一个简单的问题,但我尝试了我能想到的一切,但对一开始就不应该成为问题的事情却无济于事。

这是一个打开文件的小型 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

这是代码片段:

#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);
    }
}
Run Code Online (Sandbox Code Playgroud)

执行结果

File could not be opened.
Run Code Online (Sandbox Code Playgroud)

我确信我已经正确完成了所有包含操作,并且 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++/
Run Code Online (Sandbox Code Playgroud)

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

b4h*_*and 5

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

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

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

如果您想创建相对于二进制文件位置的路径,那么您必须自己执行此操作。许多编程语言都提供此选项,但它不是 C++ 内置的。argv[0]您可以通过使用from查找可执行文件来完成此操作main。然后,您需要删除可执行路径的文件部分,并将其替换为您感兴趣的文件名。

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

std::cout << std::filesystem::current_path() << std::endl;
Run Code Online (Sandbox Code Playgroud)