Перенаправление потоков ввода вывода windows

Содержание
  1. Использование операторов перенаправления команд
  2. Операторы перенаправления
  3. Использование операторов перенаправления
  4. Дублирование дескрипторов
  5. Перенаправление ввода команд ( )
  6. Использование оператора « &» для перенаправления ввода и дублирования
  7. Использование оператора «>>» для добавления вывода
  8. Использование оператора канала (|)
  9. Комбинирование команд с операторами перенаправления
  10. Использование операторов перенаправления команд
  11. Перенаправление ввода команд ( )
  12. Использование оператора « search.txt 2 &» для перенаправления ввода и дублирования
  13. Использование оператора «>>» для добавления вывода
  14. Использование оператора канала (|)
  15. Комбинирование команд с операторами перенаправления
  16. Перенаправление ввода-вывода и конвейеризация.
  17. Стандартные потоки
  18. Связь с консольным вводом / выводом
  19. Перенаправление стандартных потоков: функция freopen()

Использование операторов перенаправления команд

Операторы перенаправления команд используются для изменения местоположений потоков ввода и вывода команд, заданных по умолчанию, на какие-либо другие. Местоположение потоков ввода и вывода называется дескриптор.

Операторы перенаправления

В следующей таблице описаны операторы перенаправления потоков ввода и вывода команд.

Оператор перенаправления Описание
> Записывает данные на выходе команды вместо командной строки в файл или на устройство, например, на принтер.
> Добавляет выходные данные команды в конец файла, не удаляя при этом существующей информации из файла.
>& Считывает данные на выходе одного дескриптора как входные данные для другого дескриптора.
» будет единица (1). После ввода оператора « » необходимо указать, откуда читать и куда записывать данные. Можно задать имя файла или любой из существующих дескрипторов.

Для задания перенаправления в существующие дескрипторы используется амперсанд (&), затем номер требуемого дескриптора (например, &номер_дескриптора). Например, для перенаправления дескриптора 2 (STDERR) в дескриптор 1 (STDOUT) введите 1

Использование операторов перенаправления

Дублирование дескрипторов

Оператор перенаправления «&» дублирует выходные или входные данные с одного заданного дескриптора на другой заданный дескриптор. Например, для отправки выводных данных команды dir в файл File.txt и отправки ошибки вывода в файл File.txt введите:

При дублировании дескриптора происходит копирование всех его исходных характеристик. Например, если дескриптор доступен только для записи, то все его дубликаты будут доступны только для записи. Нельзя продублировать дескриптор с доступом только для чтения в дескриптор с доступом только для записи.

Перенаправление ввода команд ( )

Выходные данные практически всех команд высвечиваются в окне командной строки. Даже команды, выводящие данные на диск или принтер, выдают сообщения и запросы в окне командной строки.

Для перенаправления вывода команд из окна командной строки в файл или на устройство применяется оператор «>». Этот оператор используется с большинством команд. Например, для перенаправления вывода команды dir в файл Dirlist.txt введите:

Если файл Dirlist.txt не существует, интерпретатор команд Cmd.exe создаст его. Если файл существует, Cmd.exe заменит информацию в файле на данные, полученные от команды dir.

Для запуска команды netsh routing dump и последующей отправки результатов ее работы в Route.cfg введите:

Оператор «>» открывает заданный файл с доступом только для записи. Поэтому с помощью данного оператора файл прочитать нельзя. Например, при запуске программы с оператором перенаправления ».

Использование оператора « &» для перенаправления ввода и дублирования

При перенаправлении вывода в файл и задании существующего имени файла интерпретатор команд Cmd.exe открывает файл с доступом только для записи и переписывает его содержимое. Если дескриптор задан, интерпретатор команд Cmd.exe дублирует файл в существующий дескриптор.

Для дублирования определенного пользователем дескриптора 3 в дескриптор 1 введите:

Для перенаправления всех выходных данных, включая выходные данные дескриптора 2 (STDERR), команды ipconfig в дескриптор 1 (STDOUT) и последующего перенаправления выходных данных в Output.log введите:

Использование оператора «>>» для добавления вывода

Для добавления выходных данных команды в конец файла без потери хранящейся в нем информации используется двойной символ «больше» (>>). Например, следующая команда добавляет список каталогов, созданный командой dir, в файл Dirlist.txt:

Для добавления выходных данных команды netstat в конец файла Tcpinfo.txt введите:

Использование оператора канала (|)

Оператор канала «вертикальная линия» (|) забирает выходные данные одной команды (по умолчанию STDOUT) и направляет их на вход другой команды (по умолчанию STDIN). Например, следующая команда сортирует каталог:

В данном примере обе команды запускаются одновременно, но команда sort приостанавливает работу до получения выходных данных команды dir. Команда sort использует выходные данные команды dir в качестве своих входных данных, а затем свои выходные данные отправляет в дескриптор 1 (STDOUT).

Комбинирование команд с операторами перенаправления

Комбинируя команды-фильтры с другими командами и именами файлов, можно создавать команды на заказ. Например, для сохранения имен файлов, содержащих строку «LOG», используется следующая команда:

Выход команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле Loglist.txt в виде списка (например, NetshConfig.log, Logdat.svd и Mylog.bat).

При использовании более одного фильтра в одной команде их необходимо отделять с помощью канала (|). Например, следующая команда ищет в каждом каталоге диска C файлы, в названии которых присутствует строка «Log», и выводит их постранично на экран:

Использование операторов перенаправления команд

Операторы перенаправления команд используются для изменения местоположений потоков ввода и вывода команд, заданных по умолчанию, на какие-либо другие. Местоположение потоков ввода и вывода называется дескриптор.

В следующей таблице описаны операторы перенаправления потоков ввода и вывода команд.

Оператор перенаправления Описание
> Записывает данные на выходе команды вместо командной строки в файл или на устройство, например, на принтер.
> Добавляет выходные данные команды в конец файла, не удаляя при этом существующей информации из файла.
>& Считывает данные на выходе одного дескриптора как входные данные для другого дескриптора.
» будет единица (1). После ввода оператора « » необходимо указать, откуда читать и куда записывать данные. Можно задать имя файла или любой из существующих дескрипторов.

Для задания перенаправления в существующие дескрипторы используется амперсанд (&), затем номер требуемого дескриптора (например, &номер_дескриптора). Например, для перенаправления дескриптора 2 (STDERR) в дескриптор 1 (STDOUT) введите:

При дублировании дескриптора происходит копирование всех его исходных характеристик. Например, если дескриптор доступен только для записи, то все его дубликаты будут доступны только для записи. Нельзя продублировать дескриптор с доступом только для чтения в дескриптор с доступом только для записи.

Перенаправление ввода команд ( )

Выходные данные практически всех команд высвечиваются в окне командной строки. Даже команды, выводящие данные на диск или принтер, выдают сообщения и запросы в окне командной строки.

Для перенаправления вывода команд из окна командной строки в файл или на устройство применяется оператор «>». Этот оператор используется с большинством команд. Например, для перенаправления вывода команды dir в файл Dirlist.txt введите:

Если файл Dirlist.txt не существует, интерпретатор команд Cmd.exe создаст его. Если файл существует, Cmd.exe заменит информацию в файле на данные, полученные от команды dir.

Для запуска команды netsh routing dump и последующей отправки результатов ее работы в Route.cfg введите:

Оператор «>» открывает заданный файл с доступом только для записи. Поэтому с помощью данного оператора файл прочитать нельзя. Например, при запуске программы с оператором перенаправления ».

Использование оператора « search.txt 2 &» для перенаправления ввода и дублирования

При перенаправлении вывода в файл и задании существующего имени файла интерпретатор команд Cmd.exe открывает файл с доступом только для записи и переписывает его содержимое. Если дескриптор задан, интерпретатор команд Cmd.exe дублирует файл в существующий дескриптор.

Для дублирования определенного пользователем дескриптора 3 в дескриптор 1 введите:

Для перенаправления всех выходных данных, включая выходные данные дескриптора 2 (STDERR), команды ipconfig в дескриптор 1 (STDOUT) и последующего перенаправления выходных данных в Output.log введите:

Использование оператора «>>» для добавления вывода

Для добавления выходных данных команды в конец файла без потери хранящейся в нем информации используется двойной символ «больше» (>>). Например, следующая команда добавляет список каталогов, созданный командой dir, в файл Dirlist.txt:

Для добавления выходных данных команды netstat в конец файла Tcpinfo.txt введите:

Иногда удобнее записывать это следующим образом:

n0.html» > %OutFile% ECHO ^ >> %OutFile% ECHO ^ >> %OutFile% ECHO ^ best page^ >> %OutFile% ECHO ^ >> %OutFile% ECHO ^ >> %OutFile% ECHO Hello World >> %OutFile% ECHO ^ >> %OutFile% ECHO ^

Использование оператора канала (|)

Оператор канала «вертикальная линия» (|) забирает выходные данные одной команды (по умолчанию STDOUT) и направляет их на вход другой команды (по умолчанию STDIN). Например, следующая команда сортирует каталог:

В данном примере обе команды запускаются одновременно, но команда sort приостанавливает работу до получения выходных данных команды dir. Команда sort использует выходные данные команды dir в качестве своих входных данных, а затем свои выходные данные отправляет в дескриптор 1 (STDOUT).

Комбинирование команд с операторами перенаправления

Комбинируя команды-фильтры с другими командами и именами файлов, можно создавать команды на заказ. Например, для сохранения имен файлов, содержащих строку «LOG», используется следующая команда:

Выход команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле Loglist.txt в виде списка (например, NetshConfig.log, Logdat.svd и Mylog.bat).

При использовании более одного фильтра в одной команде их необходимо отделять с помощью канала (|). Например, следующая команда ищет в каждом каталоге диска C файлы, в названии которых присутствует строка «Log», и выводит их постранично на экран:

Наличие канала (|) указывает cmd.exe, что выход команды DIR нужно отправить команде-фильтру find. Команда find выбирает только те имена файлов, в которых содержится строка «LOG». Команда more выводит на экран имена файлов, полученные командой find с паузой после заполнения каждого экрана. Дополнительные сведения о командах-фильтрах смотри в разделе Использование фильтров.

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

Перенаправление ввода-вывода и конвейеризация.

При работе в командной строке можно переназначать устройства для ввода-вывода информации. На практике это выражается в следующем:

  • сообщения можно выводить не на экран (стандартный выходной поток), а в файл или на принтер (перенаправление вывода);
  • читать входные данные можно не с клавиатуры (стандартный входной поток), а из заранее подготовленного файла (перенаправление ввода);
  • передавать сообщения, выводимые одной программой, в качестве входных данных для другой программы (конвейеризация или композиция команд).

Все примеры, которые приведены в дальнейшем, используют в качестве текущего каталога диск «С». Для того чтобы сделать диск «С» текущим каталогом необходимо использовать команду CD\ (подробнее об этой команде смотрите здесь).
Если необходимо перенаправить текстовые сообщения, выводимые какой-либо командой, в текстовый файл, необходимо использовать конструкцию: команда > имя файла. Для примера, воспользуемся командой HELP и выведем в текстовый файл справку о команде CD: help cd > file.txt

В результате выполнения этой команды, информация о команде CD будет выведена не на экран, а в текстовый файл «file.txt», расположенный в текущем каталоге (т.е. на диске «С»). Причем, если этот файл существовал ранее в этом каталоге, он будет перезаписан, а если файла не существовало, он будет создан автоматически. Если необходимо дописать информацию в конец существующего файла, необходимо использовать конструкцию: команда >> имя файла. Для примера, допишем в текстовый файл «file.txt» информацию о команде COPY: help copy >> file.txt

В результате выполнения данной команды файл «file.txt» не будет перезаписан, а новая информация будет добавлена в конец этого файла.
Одной из команд, которая использует чтение входных данных из заранее подготовленного файла, является команда SORT. Подробно данная команда описывается в следующих уроках. Здесь следует лишь сказать, что используемая без ключей, команда SORT производит сортировку в порядке возрастания. Для примера, создадим на диске «С» текстовый файл «text.txt» и запишем в него слова: «help», «turbo», «command».

Тогда команда sort прочитает информацию из текстового файла «text.txt» и выведет её на экран в алфавитном порядке.

Одной из команд, которая использует конвейеризацию, является команда MORE. Более подробно, данная команда будет рассмотрена в следующих уроках. Здесь следует лишь сказать, что команда MORE считывает данные из конвейера или файла и выводит их на экран частями, причем размер каждой части не превышает размера окна командной строки. Для примера, выведем на экран справку о команде XCOPY: help xcopy |more

В результате выполнения данной команды, на экран вывелась справка по команде XCOPY. Причем информация вывелась частично, только та часть, которая уместилась на экране. Для дальнейшего просмотра необходимо нажимать клавишу Enter.

Стандартные потоки

Что касается файловой системы языка С, то в начале выполнения программы автоматически открываются три потока. Это stdin (стандартный поток ввода), stdout (стандартный поток вывода) и stderr (стандартный поток ошибок). Обычно эти потоки направляются к консоли, но в средах, которые поддерживают перенаправление ввода/вывода, они могут быть перенаправлены операционной системой на другое устройство. (Перенаправление ввода/вывода поддерживается, например, такими операционными системами, как Windows, DOS, UNIX и OS/2.)

Так как стандартные потоки являются указателями файлов, то они могут использоваться системой ввода/вывода языка С также для выполнения операций ввода/вывода на консоль. Например, putchar() может быть определена таким образом:

Вообще говоря, stdin используется для считывания с консоли, a stdout и stderr — для записи на консоль.

В роли указателей файлов потоки stdin , stdout и stderr можно применять в любой функции, где используется переменная типа FILE * . Например, для ввода строки с консоли можно написать примерно такой вызов fgets() :

И действительно, такое применение fgets() может оказаться достаточно полезным. Как уже говорилось в этой книге, при использовании gets() не исключена возможность, что массив, который используется для приема вводимых пользователем символов, будет переполнен. Это возможно потому, что gets() не проводит проверку на отсутствие нарушения границ. Полезной альтернативой gets() является функция fgets() с аргументом stdin , так как эта функция может ограничивать число читаемых символов и таким образом не допустить переполнения массива. Единственная проблема, связанная с fgets() , состоит в том, что она не удаляет символ новой строки (в то время как gets() удаляет!), поэтому его приходится удалять «вручную», как показано в следующей программе:

He забывайте, что stdin , stdout и stderr — это не переменные в обычном смысле, и им нельзя присваивать значение с помощью fopen() . Кроме того, именно потому, что в начале работы программы эти указатели файлов создаются автоматически, в конце работы они и закрываются автоматически. Так что и не пытайтесь самостоятельно их закрыть.

Связь с консольным вводом / выводом

В языке С консольный и файловый ввод/вывод не слишком отличаются друг от друга. Функции консольного ввода/вывода, описанные в главе 8, на самом деле направляют результаты своих операций на один из потоков — stdin или stdout , и по сути, каждая из них является специальной версией соответствующей файловой функции. Функции консольного ввода/вывода для того и существуют, чтобы было удобно именно программисту.

Как говорилось в предыдущем разделе, ввод/вывод на консоль можно выполнять с помощью любой файловой функции языка С. Однако для вас может быть сюрпризом, что, оказывается, операции ввода/вывода на дисковых файлах можно выполнять с помощью функции консольного ввода/вывода, например, printf() ! Дело в том, что все функции консольного ввода/вывода, о которых говорилось в главе 8, выполняют свои операции с потоками stdin и stdout . В средах, поддерживающих перенаправление ввода/вывода, это равносильно тому, что stdin или stdout могут быть перенаправлены на устройство, отличное от клавиатуры или экрана. Проанализируйте, например, следующую программу:

Предположим, что эта программа называется TEST. При ее нормальном выполнении на экран выводится подсказка, затем читается строка, введенная с клавиатуры, и, наконец, эта строка выводится на экран. Однако в средах, в которых поддерживается перенаправление ввода/вывода, один из потоков stdin или stdout (или оба одновременно) можно перенаправить в файл. Например, в среде DOS или Windows следующий запуск TEST

приводит к тому, что вывод этой программы будет записан в файл по имени OUTPUT. А следующий запуск TEST

направляет поток stdin в файл по имени INPUT, а поток стандартного вывода — в файл по имени OUTPUT.

Когда С-программа завершается, то все перенаправленные потоки возвращаются в состояния, которые были установлены по умолчанию.

Перенаправление стандартных потоков: функция freopen()

Для перенаправления стандартных потоков можно воспользоваться функцией freopen() . Эта функция связывает имеющийся поток с новым файлом. Так что она вполне может связать с новым файлом и стандартный поток. Вот прототип этой функции:

где имя_файла — это указатель на имя файла, который требуется связать с потоком, на который указывает указатель поток . Файл открывается в режиме режим ; этот параметр может принимать те же значения, что и соответствующий параметр функции fopen() . Если функция freopen() выполнилась успешно, то она возвращает поток , а если встретились ошибки, — то NULL .

В следующей программе показано использование функции freopen() для перенаправления стандартного потока вывода stdout в файл с именем OUTPUT.

Вообще говоря, перенаправление стандартных потоков с помощью freopen() в некоторых случаях может быть полезно, например, при отладке. Однако выполнение дисковых операций ввода/вывода на перенаправленных потоках stdin и stdout не настолько эффективно, как использование таких функций, как fread() или fwrite() .

Читайте также:  После переустановки windows не видит второй жесткий диск
Оцените статью