尝试用 C++ 打开文件,但找不到文件
Trying to open a file in C++, but the file cannot be found
我在 C++ (main.cpp) 中有一个算法,我使用 CLion 编译并 运行 它。算法将从文本文件中读取字符串,但出现错误:
无法打开 data.txt(文件存在并与 main.cpp 放在同一个文件夹中)
如何修复它并将此文件 "visible" 发送到 CLion?
如果您正在使用 fopen
或类似的东西并且只是传递 "data.txt"
,则假定该文件位于 运行 程序(您使用的那个程序)的当前工作目录中刚刚编译)。
所以,要么
改为提供完整路径,例如fopen("/full/path/to/data.txt")
,您使用实际的完整路径
(不可取),将 data.txt 移动到 CLion 运行其编译程序的目录。
(对于 #2,这是获取该目录的一种 hacky 方法)
char buf[1024]; // hack, but fine for this
printf("%s\n", getcwd(buf, 1024));
我找到了另一种方法来解决这个问题。
@Lou Franco 的解决方案可能会影响项目结构。例如,如果我在服务器上部署代码,我应该将资源文件移动到特定目录。
我所做的是使用
修改WindowsCmakeLists.txt
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "D:\science\code\English-Prediction")
CMAKE_RUNTIME_OUTPUT_DIRECTORY是一个CMake变量,它分配了CLion工作目录的工作目录。
- Run/Edit 配置...
- Select 您的应用程序(在 window 的左侧)
- 指定工作目录
- 申请
现在您可以fopen
相对于工作目录。
继续 CMAKE_RUNTIME_OUTPUT_DIRECTORY
CMakeLists 变量,我执行以下操作。在我的项目的根目录中,我创建了一个目录,例如 out
。然后,在我的 CMakeLists.txt
中,我将 CMAKE_RUNTIME_OUTPUT_DIRECTORY
设置为该目录:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/out)
注意,那必须先于你
add_executable(YourProject ${SOURCE_FILES})
我可能还会补充一点,我会通过使用 std::ifstream
:
来使其更加面向对象,而不是使用 fopen()
std::ifstream inFile("data.txt");
// check if it opened without issue...
if (!inFile) {
processError(); // a user-defined function to deal with the issue
} else {
// All is good, carry on...
// and when you're done don't forget
inFile.close();
}
我在 C++ (main.cpp) 中有一个算法,我使用 CLion 编译并 运行 它。算法将从文本文件中读取字符串,但出现错误:
无法打开 data.txt(文件存在并与 main.cpp 放在同一个文件夹中)
如何修复它并将此文件 "visible" 发送到 CLion?
如果您正在使用 fopen
或类似的东西并且只是传递 "data.txt"
,则假定该文件位于 运行 程序(您使用的那个程序)的当前工作目录中刚刚编译)。
所以,要么
改为提供完整路径,例如
fopen("/full/path/to/data.txt")
,您使用实际的完整路径(不可取),将 data.txt 移动到 CLion 运行其编译程序的目录。
(对于 #2,这是获取该目录的一种 hacky 方法)
char buf[1024]; // hack, but fine for this
printf("%s\n", getcwd(buf, 1024));
我找到了另一种方法来解决这个问题。
@Lou Franco 的解决方案可能会影响项目结构。例如,如果我在服务器上部署代码,我应该将资源文件移动到特定目录。
我所做的是使用
修改WindowsCmakeLists.txtset(CMAKE_RUNTIME_OUTPUT_DIRECTORY "D:\science\code\English-Prediction")
CMAKE_RUNTIME_OUTPUT_DIRECTORY是一个CMake变量,它分配了CLion工作目录的工作目录。
- Run/Edit 配置...
- Select 您的应用程序(在 window 的左侧)
- 指定工作目录
- 申请
现在您可以fopen
相对于工作目录。
继续 CMAKE_RUNTIME_OUTPUT_DIRECTORY
CMakeLists 变量,我执行以下操作。在我的项目的根目录中,我创建了一个目录,例如 out
。然后,在我的 CMakeLists.txt
中,我将 CMAKE_RUNTIME_OUTPUT_DIRECTORY
设置为该目录:
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/out)
注意,那必须先于你
add_executable(YourProject ${SOURCE_FILES})
我可能还会补充一点,我会通过使用 std::ifstream
:
fopen()
std::ifstream inFile("data.txt");
// check if it opened without issue...
if (!inFile) {
processError(); // a user-defined function to deal with the issue
} else {
// All is good, carry on...
// and when you're done don't forget
inFile.close();
}