Попытка открыть файл на C++, но файл не найден
У меня есть алгоритм в C++ (main.cpp) и я использую CLion для компиляции и запуска. Алгоритм будет читать строки из текстового файла, но есть ошибка:
не удалось открыть данные.txt (файл существует и помещается в одну папку с main.cpp)
Как я могу это исправить и сделать этот файл "видимым" для CLion?
4 ответов
если вы используете fopen
или что-то подобное и просто передает "data.txt"
, предполагается, что этот файл находится в текущем рабочем каталоге запущенной программы (который вы только что скомпилировали).
так, либо
дайте полный путь вместо этого, как
fopen("/full/path/to/data.txt")
, где вы используете фактический полный путь(не желательно), перемещение данных.txt в каталог, где CLion запускает свои скомпилированные программы от.
(для #2, Вот хакерский способ получить этот каталог)
char buf[1024]; // hack, but fine for this
printf("%s\n", getcwd(buf, 1024));
Я нашел другой способ решить эту проблему.
решение@Lou Franco может повлиять на структуру проекта. Например, если я развертываю код на сервере, я должен переместить файл ресурсов в определенный каталог.
то, что я делаю, это измените CmakeLists.txt, в Windows, используя
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "D:\science\code\English-Prediction")
CMAKE_RUNTIME_OUTPUT_DIRECTORY является переменной CMake, она назначает рабочий каталог рабочего каталога CLion.
- выполнить / изменить конфигурации...
- выберите приложение (слева от окна)
- указать рабочий каталог
- применить
теперь вы можете 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})
я мог бы также добавить, что вместо использования fopen()
Я бы сохранил его более объектно-ориентированным, используя std::ifstream
:
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();
}