无法打开具有相对路径的文件? (C++ ifstream)
Cannot open file with relative path? (C++ ifstream)
我知道这似乎是一个简单的问题,但我尝试了所有我能想到的方法,但对于一些本来不应该成为问题的问题都无济于事。
这是一个打开文件的小型 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);
}
}
执行结果
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++/
感谢你们的帮助!!任何建议或想法表示赞赏。
当您 运行 程序时打印出您当前的工作目录:
char buffer[256];
char *val = getcwd(buffer, sizeof(buffer));
if (val) {
std::cout << buffer << std::endl;
}
这会告诉您运行您的程序来自何处,以及路径与相对路径不匹配的原因。相对路径是相对于当前工作目录的,不是二进制文件所在的位置。
如果你想使路径相对于二进制文件的位置,那么你必须自己做。许多编程语言都将此作为一个选项提供,但它并不是 C++ 的内置功能。您可以通过使用 main
中的 argv[0]
查找可执行文件来执行此操作。然后你需要删除可执行路径的文件部分并将其替换为你感兴趣的文件名。
自 C++17 起,您可以使用 std::filesystem::current_path()
代替 getcwd
。
std::cout << std::filesystem::current_path() << std::endl;
我知道这似乎是一个简单的问题,但我尝试了所有我能想到的方法,但对于一些本来不应该成为问题的问题都无济于事。
这是一个打开文件的小型 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);
}
}
执行结果
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++/
感谢你们的帮助!!任何建议或想法表示赞赏。
当您 运行 程序时打印出您当前的工作目录:
char buffer[256];
char *val = getcwd(buffer, sizeof(buffer));
if (val) {
std::cout << buffer << std::endl;
}
这会告诉您运行您的程序来自何处,以及路径与相对路径不匹配的原因。相对路径是相对于当前工作目录的,不是二进制文件所在的位置。
如果你想使路径相对于二进制文件的位置,那么你必须自己做。许多编程语言都将此作为一个选项提供,但它并不是 C++ 的内置功能。您可以通过使用 main
中的 argv[0]
查找可执行文件来执行此操作。然后你需要删除可执行路径的文件部分并将其替换为你感兴趣的文件名。
自 C++17 起,您可以使用 std::filesystem::current_path()
代替 getcwd
。
std::cout << std::filesystem::current_path() << std::endl;