Попытка открыть файл на C++, но файл не найден

У меня есть алгоритм в C++ (main.cpp) и я использую CLion для компиляции и запуска. Алгоритм будет читать строки из текстового файла, но есть ошибка:

не удалось открыть данные.txt (файл существует и помещается в одну папку с main.cpp)

Как я могу это исправить и сделать этот файл "видимым" для CLion?

4 ответов


если вы используете fopen или что-то подобное и просто передает "data.txt", предполагается, что этот файл находится в текущем рабочем каталоге запущенной программы (который вы только что скомпилировали).

так, либо

  1. дайте полный путь вместо этого, как fopen("/full/path/to/data.txt"), где вы используете фактический полный путь

  2. (не желательно), перемещение данных.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.


  1. выполнить / изменить конфигурации...
  2. выберите приложение (слева от окна)
  3. указать рабочий каталог
  4. применить

теперь вы можете 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();
}