Давайте уточним несколько вещей:
>
, <
и несколько других символов (которые не имеют отношения к вашему вопросу) являются управляющими операторами для интерпретатора командной строки (он же ракушка). Когда оболочка видит какой-либо из них, она предполагает, что аргументы командной строки для вашей программы завершены. Таким образом, в вашем случае ваша программа будет иметь argc=2
и argv = ["name ", "inputFileName.ext"]
. - «Перенаправление» означает, что все, что ваша программа будет нормально записывать на экран через
stdout
(которое по умолчанию выводится при вызове printf()
putchar()
, puts()
) будет записано имя файла, которое следует после >
. Ваша пограмма совершенно не знает об этом факте. В вашем коде вы должны просто предполагать, что вы печатаете на экране. Ответственность за выполнение перенаправления несет тот, кто выполняет команду. (Также: «outputFileName.ext» не должен существовать, он будет создан, если он не существует, но перенаправление переопределит все ранее записанное в этом файле, поэтому будьте особенно внимательны, чтобы не перенаправить на. c файл случайно или к вашим результатам вашего предыдущего исполнения, если вам нужны оба ) <
(не в вашем вопросе, но тесно связаны) работает наоборот, как вы бы представьте, что программа читает ввод из этого файла, а не с клавиатуры. (очевидно, файл должен существовать сейчас)
Что касается второй части вашего вопроса, вы все еще можете (и должны) получить доступ к имени входного файла через содержимое argv[1]
. Вы откроете файл и прочитаете его с помощью некоторых функций C, которые принимают дескриптор файла в качестве аргумента (например, fscanf()
, fgets()
, getline()
).
Наконец, вы убедитесь, что данная команда
./name inputFileName.ext > outputFileName.ext
, а не
./name < inputFileName.ext > outputFileName.ext
?
Последняя использует перенаправление как для ввода, так и для вывода, и вам не следует делать что-нибудь другое при чтении, просто читайте нормально с stdin
.