Как связать входной текстовый файл с программой на C++

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

Ваш исполняемый файл, вероятно, не связан с текстовым файлом, который вы пытаетесь прочитать. Пожалуйста, покажите код.

Ted Lyngmo 08.11.2018 01:25

То, что происходит во время выполнения, не связано с тем, как вы компилируете или компилируете программу. Как открыть файл, который хотите прочитать?

Swordfish 08.11.2018 01:25

В некоторых экзотических средах есть «привязка» файлов ресурсов. Я сказал «наверное, нет».

Ted Lyngmo 08.11.2018 01:29

@TedLyngmo Речь идет о Windows. Итак, мы будем говорить о компиляторе ресурсов. Но я в этом сомневаюсь.

Swordfish 08.11.2018 01:46

@Swordfish Я тоже, но я добавил только «вероятно», потому что не уверен на 100%. Есть много сред, ориентированных на Windows, и я их недостаточно хорошо знаю.

Ted Lyngmo 08.11.2018 01:47

Я Угадай, что ваша программа открывает файл, используя его имя, без каталога. Это сработает, если вы запустить программу из каталога, где находится файл. Пожалуйста, поясните свой вопрос. В настоящее время это не понятно, что у вас есть и чего вы хотите достичь. Фраза «связать входной файл» непонятна сама по себе и не помогает разобраться в вопросе. Если вы не знаете правильную формулировку, покажите некоторые части вашего кода, которые показывают проблему.

Tsyvarev 08.11.2018 09:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
2 030
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не «связываете» текстовый файл с исполняемым файлом. В 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++ в колледже. Надеюсь, мы узнаем более продвинутые способы использования входных файлов. Еще раз спасибо за ответ!

Caleb Hawn 09.11.2018 21:09

Другие вопросы по теме