Как связать входной текстовый файл с программой на C ++ - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь написать программу на C ++ на CLion, которая открывает, обрабатывает и закрывает входной файл и выходной файл. Входной файл - это файл .txt, но когда я запускаю программу, он не может найти входной файл, даже если он находится в том же каталоге, что и программа .cpp, из которой он выполняется. Мне было интересно, если это было, потому что мне пришлось связать входной файл с CMake, но я, к сожалению, не знаком с настройкой CMake. Как я могу связать файл .txt с проектом C ++?

1 Ответ

0 голосов
/ 09 ноября 2018

Вы не «связываете» текстовый файл с исполняемым файлом. В 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, поскольку первый аргумент - это имя программы.)

<час />

Чтобы ответить на ваш фактический вопрос (тот, который вы задали, но не обязательно тот, на который вам нужен был ответ), вы можете использовать функцию find_file CMake , чтобы "связать" файл. На самом деле вы ничего не связываете, на самом деле, функция find_file просто возвращает полный путь к именованному файлу, но затем вы можете передать эту информацию в качестве параметра в вашу программу, как обсуждалось ранее.

Вы можете сделать больше, чем могло бы быть сразу очевидно с CMake, на самом деле; здесь - документация для их функций, связанных с файлами.

Вы также можете запустить только что созданную программу из CMake напрямую, используя функцию execute_process. Функция на самом деле напрямую принимает параметр INPUT_FILE, поэтому вы можете установить переменную для пути вашего входного файла, установить его, используя результат find_file, а затем напрямую запустить программу с вашим входным файлом, используя execute_process.

...