Блоки кода, перенаправляющие ввод-вывод

Я новичок в кодовых блоках и не могу заставить его работать с аргументами командной строки ‹ input > output. Кто-нибудь знает, как?

В настоящее время я могу прочитать файл, переданный из argv[1], но программа не считывает автоматически ввод из данного файла и не корректирует вывод в вывод файла.

Я знаю, что это набор аргументов программы, моя строка аргументов: list.txt ‹ ввод> вывод

После некоторых исследований я увидел, как парень делает это так: ‹ ./input > ./output, похоже, запускает программу для ввода и вывода, в любом случае, я также пробовал это безрезультатно. Нужно ли использовать обработчики файлов для взаимодействия с ним? Это не имеет смысла, простой getchar() должен читать из проходящего входного файла.

Что мне здесь не хватает?

заранее спасибо


person d0pe    schedule 08.11.2012    source источник
comment
Это перенаправляет только стандартный ввод и вывод. Использование printf() и scanf(), puts() и getline() и т. д. должно подойти.   -  person    schedule 08.11.2012
comment
Это все еще не работает :( Я изменил getchar() на получает, как я хотел, всю строку, теперь я получаю char за char внутри строки, но когда я запускаю его, он все еще ждет ручного ввода. Я действительно думаю, что это проблема кодовых блоков.   -  person d0pe    schedule 08.11.2012
comment
Нет, это ни в коем случае не проблема кодовых блоков, вы что-то упускаете... Представьте, что может сделать IDE? Это даже не компилятор...   -  person    schedule 08.11.2012
comment
Ну, я перешел на Linux, команда ввода работает нормально, так что это должно быть проблема с IDE. Кроме того, он отлично читает getchar(), нет необходимости сканировать или читать из ‹input. Что ж, думаю, мне придется обойти это и вручную вводить команды, а затем выставить время на Linux. В любом случае спасибо   -  person d0pe    schedule 08.11.2012
comment
@ d0pe Можете ли вы привести пример программы, демонстрирующей проблему, которую вы демонстрируете, и шаги, необходимые для ее воспроизведения?   -  person fuz    schedule 09.11.2012


Ответы (6)


Я нашел способ, как это сделать в CB 13.12

Tools -> Configure Tools -> Add:

Name: whatever
Executable: C:\Windows\System32\cmd.exe
Parameters: /C ${TARGET_OUTPUT_BASENAME} exampleArg1 <inputFileRedirect.txt
Working Directory: ${TARGET_OUTPUT_DIR}

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

person Aleš Koblížek    schedule 10.10.2014
comment
Спасибо, это единственный, который работал на Windows. - person CodeMonkey; 05.08.2017

Я работаю с Code::Blocks уже некоторое время и совсем недавно заметил то же самое, по крайней мере, с Code::Blocks 12.11 в Windows. Перенаправления > и не работают в аргументах Проект -> Установить программы...

Хакерское решение состоит в том, чтобы выполнить выполнение на этапе после сборки.

Щелкните правой кнопкой мыши project name -> Build options... -> Pre/post build steps -> Post-build steps:

cmd /C cd /D "bin\$(TARGET_NAME)\" & YourApplicationNameHere.exe >output.txt 2>errors.txt

И установите флажок Всегда выполнять, даже если цель актуальна. Теперь нажмите Ctrl+F9, и программа запустится как последний шаг процесса сборки.

person user2678713    schedule 13.08.2013

Я думаю, что проблема в cb_console_runner.exe, который запускает вашу программу в IDE. ConsoleRunner не может интерпретировать символ перенаправления. Итак, я добавляю некоторый код к исходному коду кодовых блоков 13.12. Скопируйте связанный файл в [папку cb]. (Не забудьте сделать резервную копию оригинала.)

двоичный файл: http://limity.tistory.com/attachment/[email protected]

исходный код: http://limity.tistory.com/attachment/[email protected]

person Jehan Yoon    schedule 16.10.2015

Мне удалось перенаправить ввод в мою программу c, установив аргументы программы в меню проекта.

Перейдите к Top Menu>Project>Set programs' arguments и поместите </absolute/path/to/yourinputfile уведомление < в начало, это обманывает кодовые блоки в файле перенаправления вместо передачи аргумента.

введите здесь описание изображения

person codefreak    schedule 20.11.2015
comment
Пробовал с Code::Blocks 16.01, но это не сработало, поскольку приводит к вызову Executing: "C:\Program Files (x86)\CodeBlocks/cb_console_runner.exe" "C:\Work\cpp\cout\cout.exe" <input.txt, а cb_console_runner.exe не передает перенаправленный ввод дочернему процессу. - person Vadzim; 05.08.2016

Я знаю, что это старая тема, но ни одно из решений не является достаточно хорошим. Для Windows я бы, вероятно, использовал следующее определение макроса (поскольку оно может понадобиться вам также для отладочной печати или аналогичного) в глобальной области видимости.

#include <cstdio>
#ifdef DEBUG
    #define D(X) X
#else
    #define D(X)
#endif

Затем в качестве первой или второй строки (если вам нужно std::ios::sync_with_stdio(false); ) в основном используйте ее как

int main() {
   D(freopen("input.txt","r",stdin);)
   D(freopen("ouput.txt","w",stdout);)
   ...

И определите в Code::Blocks в разделе "Проекты" > "Параметры сборки"... > (Отладка, Настройки компилятора, #define)

ОТЛАЖИВАТЬ

Ожидается, что «input.txt» — это входной текстовый файл в папке, где находятся остальные файлы .c или .cpp, а «output.txt» — это выходной файл, сгенерированный в той же папке (или они могут быть добавлены оба в проект в виде таких файлов для более удобного редактирования/просмотра).

Это решение будет работать как с cin/cout, так и с scanf/printf.

person Star Wolf    schedule 30.01.2017
comment
Я не понял использование DEBUG? Что именно он делает?? - person Sumit; 17.04.2020
comment
@Sumit Использование DEBUG такое же, как если бы у вас была первая строка программы #define DEBUG, но только когда локально выбрана сборка отладки. Например, если вы следовали приведенным выше инструкциям и отправили такой код оценщику, любой код между D( и ) будет исключен во время компиляции, таким образом, не задохнувшись отсутствующим входным файлом в удаленной системе/оценщике. С приведенным выше кодом/конфигурацией вы получите такие же результаты, как если бы вы использовали для установки аргументов программы для сборки отладки в Linux ‹ ./input.txt › ./ouput.txt. - person Star Wolf; 18.06.2021

Я перепробовал почти все варианты и не смог заставить их работать :P После того, как мне все это надоело, я в основном использую обработку файлов, чтобы выполнить свою работу (тьфу-тьфу)

вот что я сделал в коде

В глобальном масштабе я написал:

#define DEBUG

#ifdef DEBUG
#include<fstream>

ifstream Inputfile;
ofstream Outputfile;

#define cin     Inputfile
#define cout    Outputfile

#endif  //#ifdef DEBUG

& в основном я написал следующее, прежде чем делать что-либо еще:

int main(){
#ifdef DEBUG

    Inputfile.open("Input.txt");
    Outputfile.open("Output.txt");;

#endif // #ifdef DEBUG

Наконец, непосредственно перед закрытием основного процесса сделал следующее:

#ifdef DEBUG

    Inputfile.close();
    Outputfile.close();

#endif // #ifdef DEBUG

После этого добавил два файла

Ввод.txt

&

вывод.txt

к проекту

Это сработало, как и ожидалось

person HumbleDeveloper    schedule 26.05.2016
comment
это только С++ - person Ricardo Zorio; 05.06.2018