Я пытаюсь написать программу на C++ в CLion, которая открывает, манипулирует и закрывает входной файл и выходной файл. Входной файл - это файл .txt, но когда я запускаю программу, он не может найти входной файл, даже если он находится в том же каталоге, что и программа .cpp, из которой она выполняется. Мне было интересно, было ли это из-за того, что мне пришлось связать входной файл с CMake, но, к сожалению, я не знаком с настройкой CMake. Как связать файл .txt с проектом C++?
То, что происходит во время выполнения, не связано с тем, как вы компилируете или компилируете программу. Как открыть файл, который хотите прочитать?
В некоторых экзотических средах есть «привязка» файлов ресурсов. Я сказал «наверное, нет».
@TedLyngmo Речь идет о Windows. Итак, мы будем говорить о компиляторе ресурсов. Но я в этом сомневаюсь.
@Swordfish Я тоже, но я добавил только «вероятно», потому что не уверен на 100%. Есть много сред, ориентированных на Windows, и я их недостаточно хорошо знаю.
Я Угадай, что ваша программа открывает файл, используя его имя, без каталога. Это сработает, если вы запустить программу из каталога, где находится файл. Пожалуйста, поясните свой вопрос. В настоящее время это не понятно, что у вас есть и чего вы хотите достичь. Фраза «связать входной файл» непонятна сама по себе и не помогает разобраться в вопросе. Если вы не знаете правильную формулировку, покажите некоторые части вашего кода, которые показывают проблему.





Вы не «связываете» текстовый файл с исполняемым файлом. В CLion по умолчанию двоичный файл проекта создается в папке с именем cmake-build-debug. Текстовый файл, который вы хотите использовать в качестве ввода, должен находиться в том же каталоге, что и файл .exe, а не .cpp, поэтому в этом случае вам нужно будет добавить ../ к имени текстового файла (т.е. . если ваш файл называется input.txt, код C скажет что-то вроде
FILE* input_file = fopen("../input.txt", "r");
Не забудьте проверить коды возврата, ошибки и т. д.
Вышеупомянутое решение не подходит по разным причинам; во-первых, вы жестко кодируете имя файла, что в лучшем случае является огромным ограничением, а в худшем - бессмысленным. Лучшим решением было бы передать имя файла через командную строку.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
if (argc != 2) { return EXIT_FAILURE; }
FILE* inputFile = fopen(argv[1], "r");
...
return EXIT_SUCCESS;
}
Однако это решение все еще не очень хорошее, в первую очередь потому, что вы всегда должны дезинфицировать свои входные данные, никогда не принимать строковый ввод от пользователя и просто сразу же использовать его. Это огромная ответственность за безопасность. Я также не проверял коды возврата или что-то еще; Я просто проверил, что argc было два. (Помните, что программа всегда будет иметь argc, по крайней мере, равный 1, поскольку первый аргумент - это имя программы.)
Чтобы ответить на ваш фактический вопрос (тот, который вы задали, хотя и не обязательно тот, на который вам нужен был ответ), вы можете использовать CMake find_fileфункция для «ссылки» на файл. Фактически вы ничего не связываете, на самом деле функция find_file просто возвращает полный путь к названному файлу, но затем вы можете передать эту информацию в качестве параметра вашей программе, как обсуждалось ранее.
На самом деле, с помощью CMake вы можете сделать больше, чем может быть сразу очевидно; здесь - это документация по их файловым функциям.
Вы также можете выполнить свою недавно созданную программу напрямую из CMake, используя функцию execute_process. Функция фактически принимает параметр INPUT_FILE напрямую, поэтому вы можете установить переменную для пути к вашему входному файлу, установить ее, используя результат find_file, а затем напрямую выполнить программу с вашим входным файлом, используя execute_process.
Спасибо! Я также связался с JetBrains по этой проблеме, и они сказали то же самое. Я просто поместил входной файл в каталог cmake-build-debug, запустил программу, и выходной файл был создан там. Это очень помогает, и ваш ответ очень подробный. Кроме того, причина, по которой моя программа берет строки из определенного файла, заключается в том, что это то, что требуется для моего класса C++ в колледже. Надеюсь, мы узнаем более продвинутые способы использования входных файлов. Еще раз спасибо за ответ!
Ваш исполняемый файл, вероятно, не связан с текстовым файлом, который вы пытаетесь прочитать. Пожалуйста, покажите код.