8 1 4 2 выбор формата вывода файла опции вывода


Содержание

Форматированный вывод. Функция printf

Пожалуйста, приостановите работу AdBlock на этом сайте.

В первом уроке мы научились выводить на экран произвольную строчку. Но это самое простое, что может сделать функция printf . Давайте теперь подробнее разберемся, как она устроена и как работает.

Общий синтаксис функции printf следующий:

Рис.1. Общий синтаксис функции printf.

У функции printf есть один обязательный параметр – строка, заключенная в двойные кавычки. Эту строку еще называют формат-строкой .

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

Кроме обязательной строки форматирования есть и необязательные параметры. Они пишутся через запятую после формат-строки.

Формат-строка.

Любой символ в формат-строке относится к одной следующих групп:

  • символы, которые выводятся на экран без изменений
  • escape-последовательности
  • спецификаторы формата

Еscape-последовательности

С этой группой символов мы уже встречались в первом уроке. Символ \n . Он, как вы наверное помните, переносит выводимый текст на новую строку. Есть и другие эскейп-последовательности (иногда можно встретить название управляющие последовательности). Любая такая последовательность начинается с символа обратный слеш \ .

Часто используемые escape-последовательности:

\n — новая строка
\t — горизонтальная табуляция. Сдвигает выводимые данные вправо на ближайшую позицию табуляции. Обычно используется для выравнивания текста внутри строки.
\’ — вывод символа ‘
— вывод символа »
\\ — вывод символа \
\? — вывода символа ?

Как видите, последние четыре последовательности нужны лишь для того, чтобы вывести на экран символы «»», «’», «\» и «?». Дело в том, что если эти символы просто записать в формат-строку, то они не отобразятся на экране, а в некоторых случаях программа и вовсе не скомпилируется.

Следующая программа иллюстрирует работу escape-последовательностей.

Хотя escape-последовательности состоят из нескольких символов, но в потоке вывода они воспринимаются как цельный символ, который имеет своё собственное значение.

Итого, используя управляющие последовательности мы можем влиять на то, как данные будут выводиться на экране.

Спецификаторы формата.

Спецификаторы формата всегда начинаются с символа % , и предназначены для вывода на экран значений переменных и выражений.

Для каждого типа данных есть свой спецификатор формата. Ниже записаны основные из них.

Основные спецификаторы формата:

%d, %i — целые числа
%f, %g — вещественные числа
%c — символы

Есть и другие спецификаторы формата. Мы познакомимся с ними тогда, когда они нам понадобятся.

Сами спецификаторы формата на экран не выводятся. Вместо них выводятся данные, которые передаются в функцию printf после строки форматирования.

Функция printf работает следующим образом. Все символы, заключенные в двойные кавычки, кроме управляющих последовательностей и спецификаторов формата, выводятся на экран. Спецификаторы формата во время вывода заменяются на значения, указанные после формат-строки. Причем, если используется несколько спецификаторов формата, то первый спецификатор заменяется на первое значение, расположенное после формат строки, второй – на второе, и т.д.

Посмотрим на примерах.

Рис.2 Вывод Листинг 2.

Рис.3 Вывод Листинг 3.

Рис.4 Вывод Листинг 4.

Рис.5 Вывод Листинг 5.

На следующей картинке показан принцип работы функции printf .

Рис.6 Принцип работы функции printf.

По сути, формат строка задаёт некоторый трафарет(шаблон), в который подставляются данные для вывода, в том порядке, в котором они указаны.

Два основных правила, которые нужно соблюдать при работе с функцией printf :

  • количество спецификаторов формата должно совпадать с количеством данных для вывода
  • спецификаторы формата должны точно соответствовать типам выводимых данных

Пара примеров неправильного использования функции printf .

Напишем небольшую программу, которая иллюстрирует использование спецификаторов формата.

Модификаторы формата.

Обратите внимание, что вещественные числа через спецификатор %f выведены с шестью знаками после запятой. У вас на компьютере может быть выведено как больше, так и меньше знаков. Обычно такая точность не нужна. К счастью, этим можно управлять. Для этого предназначены модификаторы формата .

Модификаторы формата записываются между символом % и буквой используемого типа. На рисунке ниже представлена спецификатор формата с использованием модификатора формата.

Рис.7 Модификатор формата

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

В примере на картинке под вещественное число мы выделяем 8 символов и хотим видеть 3 знака после запятой.

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

У первого числа может спереди еще стоять знак минус, например %-8.3f . Этот минус говорит о том, что необходимо выровнять число по левому краю используемой области.

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

Результат работы данной программы представлен на рисунке ниже.

Рис.8 Вывод Листинг 8.

Я специально поставил вокруг каждого числа прямые черточки, что можно было увидеть, что означает ширина поля для вывода и как работает выравнивание по левому краю.

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

Да, чуть не забыл. Мы решили одну из задач, которая стояла перед нами в начале урока.


Практика

Решите предложенные задачи. Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров:

  1. Теперь вы можете увидеть, как выглядит мусор, который хранится в переменной после её объявления. Для этого объявите переменную любого типа и выведете её значение на экран использую функцию printf .
  2. Найдите в стандарте языка, в справочной системе компилятора полный список escape-последовательностей. Попробуйте использовать их в вашей программе. Разберитесь как они работают.
  3. Выясните, что произойдет, если в формат-строку функции printf вставить \c , где c — любой символ, не входящий в список escape-последовательностей. [K&R]
  4. Разберитесь с тем, как работает модификатор точности для целых чисел.
  5. Попробуйте вывести символы «»», «’», «\» и «?» без использования escape-последовательностей.
  6. Изучите как работает спецификатор %e

Дополнительные материалы

  1. Ранее я говорил, что тип double называется типом двойной точности, и что он в некотором смысле лучше, чем тип float . Запустите следующую программу, чтобы убедиться в этом.

Причина подобного результата в том, что количество памяти выделенное для хранения любой переменной ограничено Из-за этого вещественные числа хранятся в памяти компьютера приближенно. Для типа float памяти выделяется обычно меньше, чем для типа double . Поэтому возникают такие забавные моменты. Отдельно обратите внимание на результат деления целых чисел, записанный в переменную z . Об этом мы поговорим в следующем уроке.

Команда DIR для вывода информации о содержимом каталогов и дисков.

Команда DIRиспользуется для вывода на экран информации о содержимом каталогов и дисков. Данная команда имеет следующий синтаксис: DIR [диск:][путь][имя файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N][/O[[:]порядок сортировки]] [/P] [/Q] [/R] [/S] [/T[[:]время]] [/W] [/X] [/4][диск:][путь][имя файла].

Как видно из синтаксиса, команду DIR можно использовать без параметров. В этом случае команда DIR действует на текущий каталог. На экран выводится метка диска (тома), его серийный номер, имена файлов и подкаталогов, находящихся в текущем каталоге и дата их последнего изменения. Для файлов, указывается их размер, общее количество. Также указывается общее количество папок и объем свободного места на диске. Для примера, применим команду DIR для диска «C»: dir

Если в команде DIR используется только параметр [диск:], то на экран будет выведено содержимое диска. Если в команде используется параметр [диск:][каталог], то на экран будет выведено содержимое каталога. Если в команде используется параметр [диск:][каталог][имя файла], то на экран будет выведена информация о файле или группе файлов. Для примера, выведем на экран содержимое диска «D»: dir d:\ ( либо dir d: )

Создадим на диске «D» папку «FOLDER» и поместим в нее 2 папки «Folder1» и «Folder2», а также файл «myfolder.txt». Тогда команда dir d:\FOLDER выведет на экран информацию о содержимом каталога «FOLDER».

Команда dir d:\FOLDER\*.txt выведет на экран информацию о текстовых файлах, расположенных в папке «FOLDER».

Ключ /P применяется в том случае, если содержимое диска или каталога не умещается в одном экране. Для примера, выведем на экран содержимое каталога «Windows»: dir windows /p

На экран будет выведена информация о содержимом каталога Windows. Т.к. все содержимое не умещается в один экран, применяем ключ /P. Для просмотра следующего экрана нажимаем любую клавишу.

Ключ /W используется в том случае, если необходимо вывести перечень файлов и каталогов в одной строке с максимально возможным их количеством, умещающемся на экране (широкий формат). Файлы и папки выводятся в алфавитном порядке (сортируются по строкам). Например, выведем на экран содержимое диска «С»: dir /w

Ключ /D аналогичен предыдущему ключу /W, однако в данном случае сортировка производится по столбам. Выведем содержимое диска «С»: dir /d

Ключ /A: [атрибуты] применяется для вывода информации о файлах и папках, которые имеют указанные атрибуты. Атрибутами могут быть:

  • H – на экран выводятся скрытые файлы и папки
  • S – на экран выводятся системные файлы и папки
  • R – на экран выводятся файлы и папки, с атрибутом «только для чтения»
  • A – на экран выводятся файлы и папки с установленным архивным атрибутом
  • I – на экран выводятся файлы и папки с неиндексированным содержимым

Для примера, пусть на диске «D» есть папка «FOLDER». В ней находятся 2 папки «Folder1» и «Folder2», а также файл «myfolder.txt». Установим для папки «Folder2» и файла «myfolder.txt» атрибут «скрытый». Тогда команда dir d:\FOLDER a:h выведет на экран только информацию об этих скрытых файлах.

Ключ /A может использоваться более чем с одним значением атрибута. Например, выведем на экран информацию о папках и файлах, находящихся на диске «С» и имеющих, одновременно, атрибуты «скрытый» и «системный»: dir /a:hs

Обратите внимание, что на экран выводятся файлы и папки, которые имеют атрибуты «скрытый» и «системный» одновременно .

Если перед атрибутами поставить знак «-», то на экран будет выводиться информация о файлах и папках, которые не имеют указанный атрибут. Например, команда dir /a:-r выведет на экран информацию о файлах и папках, расположенных на диске «C» и не имеющих атрибут «только для чтения».

Если ключ /A употребить с параметром «D», то на экран будет выведена информация только а каталогах. Например, команда dir /a:d выведет на экран информацию о каталогах диска «С», но не выведет информацию о файлах.

Соответственно, если нам необходимо вывести на экран только файлы, то используется ключ /-D. Например, выведем на экран файлы, расположенные на диске «С»: dir /a:-d

По умолчанию (без ключа /A), команда DIR выводит на экран имена всех папок и файлов, кроме скрытых и системных. При использовании команды DIR с ключом /A без параметров, на экран выводятся имена всех папок и файлов. Например, команда dir /a выведет на экран имена всех папок и файлов (включая системные и скрытые файлы) текущего каталога.

Ключ /S позволяет выводить информацию о файлах из заданного каталога и его подкаталогов. Для примера, создадим на диске «D» папку «FOLDER», поместим в нее еще 2 папки «Folder1» и «Folder2». В каждую из 3-х папок поместим по одному файлу. Тогда команда dir d:\FOLDER /s выведет на экран содержимое основной папки «FOLDER» и всех подпапок «Folder1» и «Folder2».

1. «Классический» ввод/вывод

В языке С определены три стандартных потока ввода/вывода:

  1. stdin – стандартное устройство ввода (клавиатура);
  2. stdout – стандартное устройство вывода (экран);
  3. stderr – стандартное устройство вывода сообщения об ошибках (также экран).

Простейший ввод/вывод:

  • getch() – ввод одного символа без отображения его на экране;
  • getche() – ввод одного символа с отображением его на экране;
  • putchar(int c) – вывод одного символа на экран.

Все эти функции требуют включения заголовочного файла .

Все остальные функции ввода/вывода определены в заголовочном файле .

1.1. Ввод/вывод с экрана

Для ввода и вывода на экран используются функции scanf и printf соответственно, прототипы которых имеют следующий вид: int scanf ( char * format , . ); int printf ( char * format , . );

Вывод осуществляется функцией printf, которая имеет следующий синтаксис: printf( [, ]);

Строка описания форматов состоит из обычных символов, специальных управляющих последовательностей символов и спецификаций формата.

Обычные символы и управляющие последовательности просто копируются в стандартный выходной поток в порядке их появления.

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

Ввод осуществляется функцией scanf, которая имеет следующий синтаксис: scanf( [, ]);

Строка описания форматов состоит из набора спецификаций формата, таких же, как для функции printf. Список ввода состоит из адресов переменных, куда будут заноситься вводимые значения. Адрес переменной вычисляется с помощью унарной операции &. Количество спецификаций формата должно быть равно количеству вводимых значений, которые указываются в списке ввода.

Функция scanf возвращает количество успешно введенных и преобразованных значений. Функция printf возвращает количество символов, записанных в выходной поток.

К управляющим последовательностям относятся следующие последовательности символов.

Последовательность Дейcтвие
\a Звуковой сигнал
\b Удаление предыдущего символа
\n Новая строка
\r Возврат каретки
\t Табуляция
\’ Апостроф
Кавычки
\\ Обратный слеш
\ooo ASCII символ в восьмеричной нотации
\xooo ASCII символ в шестнадцатеричной нотации

Спецификация формата, которая состоит из обязательных и необязательных полей, имеет следующий вид:

Флаги Значение По умолчанию
Выравнивание по левому краю. Выравнивание по правому краю.
+ Добавление знака + или – перед числами. Знак добавляется только перед отрицательными числами.
Добавление нулей перед выводимым значением. Если одновременно используются флаги – и 0, 0 игнорируется. Добавление пробелов.
пробел Добавление пробела перед положительным числом. Если одновременно используются флаги пробел и +, пробел игнорируется. Пробел не добавляется.
# Добавление символов 0, 0х или 0Х перед ненулевым значением, если флаг # используется с форматами о, х или Х соответственно. Символы 0, 0х и 0Х не добавляются.
При использовании с форматами e, E и f флага # выводимое число будет содержать десятичную точку в любом случае. Десятичная точка добавляется, только если за ней следуют цифры.
При использовании с форматами g и G флага # выводимое число будет содержать десятичную точку и хвостовые нули в любом случае. Десятичная точка добавляется, только если за ней следуют цифры. Хвостовые нули не выводятся.
Игнорируется при использовании с форматами c, d, i, u и s.

Поле ширина содержит минимальное количество выводимых символов – неотрицательное целое число. Если выводимое значение содержит меньше символов, то оно расширяется пробелами (если не задан флаг ). Если поле ширина содержит звездочку (*), то в качестве значения поля берётся целое число из списка аргументов, предшествующее выводимому значению.

Поле точность также представляет собой неотрицательное целое число. Действие зависит от типа выводимого значения.

Тип Действие По умолчанию
c, C Точность не имеет эффекта. Выводится символ.
d, i, u, o, x, X Точность задаёт минимальное количество символов, которые будут напечатаны. Если число содержит меньше символов, оно расширяется нулями. Точность равна 1.
e, E, f Точность задаёт количество символов после десятичной точки. Число округляется. Точность равна 6. Если точность равна 0 или опущена, десятичная точка не выводится.
g, G Точность задаёт максимальное количество значащих цифр. Печатается 6 значащих цифр.
s, S Точность задаёт максимальное количество выводимых символов. Выводятся все символы строки.

Если поле точность содержит звездочку (*), то в качестве значения поля берётся целое число из списка аргументов, предшествующее выводимому значению.


Дополнительные префиксы h, l, L и I64 задают «размер» аргумента – long или short, однобайтовый символ или расширенный символ, в зависимости от спецификации типа, которую они модифицируют.

Обязательное поле тип задаёт тип выводимого значения.

Символ Тип Формат вывода
c int или wint_t При использовании с функцией printf определяет однобайтовый символ, при использовании с функцией wprintf определяет расширенный символ.
C int или wint_t При использовании с функцией printf определяет расширенный символ, при использовании с функцией wprintf определяет однобайтовый символ.
d int Знаковое десятичное целое.
i int Знаковое десятичное целое.
o int Беззнаковое восьмеричное целое.
u int Беззнаковое десятичное целое.
x int Беззнаковое шестнадцатеричное целое с использованием символов «abcdef».
X int Беззнаковое шестнадцатеричное целое с использованием символов «ABCDEF».
e double Знаковое число в форме [ – ]d.dddd e [знак]ddd, где d есть одна десятичная цифра, dddd – одна или более десятичных цифр, ddd – три десятичные цифры and знак есть + или –.
E double Идентичен формату e, за исключением того, что символ E, а не e вводит экспоненту.
f double Знаковое число в форме [ – ]dddd.dddd, где dddd есть одна или более десятичных цифр. Количество цифр перед десятичной точкой зависит от величины числа, а количество цифр после десятичной точки – от требуемой точности.
g double Знаковое число в формате f или e, в зависимости от того, какой формат более компактен для заданного значения и точности.
G double Идентичен формату g, за исключением того, что символ E, а не e вводит экспоненту.
n pointer to integer Количество символов успешно записанных к данному моменту в выходной поток. Это значение сохраняется в целочисленной переменной, чей адрес задан как аргумент.
p pointer to void Печатает адрес, заданный аргументом.
s string При использовании с функцией printf задаёт строку однобайтовых символов, при использовании с функцией wprintf задаёт строку расширенных символов. Символы печатаются до достижения признака конца строки.
S string При использовании с функцией printf задаёт строку расширенных символов, при использовании с функцией wprintf задаёт строку однобайтовых символов. Символы печатаются до достижения признака конца строки.

int m, n, x; double y; char c = ‘&’; char str[] = «String»;
scanf(«%d%d», &m, &n); // Ввод десятичных целых чисел в переменные m и n
printf(«m = %5d\nn = %5d\n», m, n); // Вывод переменных m и n в десятичном целом формате, используются как минимум 5 знаков
scanf(«%d», &x); // Ввод десятичного целого числа в переменную x
printf(«%#010x\n», x); // Вывод переменной x в шестнадцатеричной системе, используются 10 знаков, // впереди добавляются нули и символы
scanf(«%lf», &y); // Ввод вещественного числа в переменную y
printf(«y = %7.2lf\n», y); // Вывод вещественной переменной, используются как минимум 7 знаков, из них 2 – после точки
printf(«c = %c\n», c); // Вывод одного символа
printf(«%.4s\n», str); // Вывод строки (не более 4 символов)

1.2. Чтение из строки/запись в строку

Функции sprintf и sscanf позволяют произвести запись значений переменных в форматированную строку или чтение переменных из строки: int sscanf ( char * str , char * format , . ); int sprintf ( char * str , char * format , . );

Эти функции во всём аналогичны функциям printf и scanf, только в качестве первого параметра указывается строка, куда записываются или откуда считываются данные.

1.3. Работа с файлами

  • Объявление файловой переменной
– FILE * file ;
  • Открытие файла
– FILE * fopen ( char * name , char * mode );
  • Проверка достижения конца файла
– int feof ( FILE * file );
  • Закрытие файла
– int fclose ( FILE * file );

FILE – специальная структура, объявленная в файле , которая используется при работе с файлами. Для работы с файлом нужно объявить переменную FILE * .

Функция fopen используется для открытия файла. Первый параметр задаёт имя файла. Второй параметр mode задаёт требуемый тип доступа к файлу.

Mode Действие
«r» Открытие для чтения. Если файл не существует или не может быть найден, функция fopen возвращает признак ошибки.
«w» Открытие для записи. Если файл существует, его содержимое уничтожается. Если файл не существует, он создаётся.
«a» Открытие для добавления. Если файл не существует, он создаётся.
«r+» Открытие для чтения и записи. Файл должен существовать.
«w+» Открытие пустого файла для чтения и записи. Если файл существует, его содержимое уничтожается.
«a+» Открытие для чтения и добавления. Если файл не существует, он создаётся.

Кроме того, к параметру mode могут быть добавлены символы t и b для задания текстового и двоичного режимов соответственно. По умолчанию используется текстовый режим.

В случае ошибки функция fopen возвращает значение NULL.

1.3.1. Текстовый режим

При вводе/выводе в текстовом режиме происходит преобразование между внешним представлением значения и внутренним (машинным) представлением этого значения.

  • Ввод одного символа
– int getc ( FILE * file );
  • Вывод одного символа
– int putc ( int c , FILE * file );
  • Ввод
– int fscanf ( FILE * file , char * format , . );
  • Вывод
– int fprintf ( FILE * file , char * format , . );
  • Ввод строки
– char * fgets ( char * line , int maxline , FILE * file );
  • Вывод строки
– int fputs ( char * line , FILE * file );

1.3.2. Двоичный режим

В двоичном режиме никаких преобразований не производится, внутреннее представление значения записывается в файл. Для открытия файла в двоичном режиме необходимо в параметр mode функции fopen добавить символ b.

  • Ввод из двоичного файла
– unsigned fread ( void * buf , int bytes , int num , FILE * file );
  • Вывод в двоичный файл
– unsigned fwrite ( void * buf , int bytes , int num , FILE * file );

Функция fread читает из файла file в переменную buf num элементов, каждый размером bytes байт. Функция fwrite записывает в файл file из переменной buf num элементов, каждый размером bytes байт. Функции возвращают количество прочитанных/записанных элементов.

В двоичном режиме возможен прямой доступ к файлу: int fseek(FILE *file, long nbytes, int origin)

Данная функция смещает указатель в файле file на nbytes байт с позиции, определяемой параметром origin. При этом параметр origin может принимать следующие значения:

  • SEEK_SET 0 – начало файла;
  • SEEK_CUR 1 – текущая позиция указателя;
  • SEEK_END 2 – конец файла.

Функция long ftell(FILE *file) возвращает текущую позицию указателя в файле file.

fseek(file, 0, SEEK_END); n = ftell(file); // Определение размера файла

2. Потоковый ввод/вывод

В языке С++ был разработан другой способ ввода/вывода с использованием так называемых потоков ввода и вывода.

2.1. Использование стандартных потоков cin и cout

Для того чтобы использовать стандартные потоки для ввода и вывода, необходимо включить заголовочный файл . Для ввода используется операция >>, для вывода – операция #include using namespace std; cin >> x; // Ввод значения в переменную x из стандартного потока cin cout > x >> y; // Ввод двух переменных cout > x; if (cin.fail()) cout .

Несколько манипуляторов имеют параметр, который может быть задан литералом или переменной. Изменения, сделанные всеми манипуляторами, кроме setw, остаются в силе до отмены. Действие манипулятор setw распространяется только на одно вводимое/выводимое значение.

Манипулятор Описание Примечание
boolalpha Значения переменных типа bool выводятся как true и false.
dec Целые значения выводятся в десятичной системе счисления. Используется по умолчанию
fixed Для вещественных чисел используется фиксированный формат.
hex Целые значения выводятся в шестнадцатеричной системе счисления.
internal Знак выравнивается по левому краю, а само число – по правому краю.
left Выравнивание по левому краю.
noboolalpha Значения переменных типа bool выводятся как 1 и . Используется по умолчанию
noshowbase Префиксы и , обозначающие систему счисления, не выводятся. Используется по умолчанию
noshowpoint Вывод только целой части вещественного числа (без точки), если дробная часть равна 0. Используется по умолчанию
noshowpos Знак перед положительными числами не выводится. Используется по умолчанию
noskipws Пробел рассматривается как признак завершения ввода.
nouppercase Шестнадцатеричные цифры и символ экспоненты в научном формате вещественного числа выводятся строчными буквами. Используется по умолчанию
oct Целые значения выводятся в восьмеричной системе счисления.
right Выравнивание по правому краю. Используется по умолчанию
scientific Для вещественных чисел используется научный формат.
setfill(c) Задаёт символ для заполнения. По умолчанию используется пробел.
setprecision(n) Задаёт точность для вещественных чисел. По умолчанию точность равна 6. Если не установлен ни фиксированный, ни научный формат вещественного числа, то точность задаёт количество выводимых цифр (всего, до точки и после точки). Если число слишком велико, оно автоматически отображается в научном формате, и тогда точность задаёт количество цифр в мантиссе. Если установлен фиксированный формат вещественного числа, точность задаёт количество цифр после точки. Если установлен научный формат вещественного числа, точность задаёт количество цифр в мантиссе.
setw(n) Устанавливает минимальное количество символов, используемых для вывода значения. Если значение представляется меньшим количеством символов, остальные позиции заполняются символом, установленным с помощью манипулятора setfill. Выравнивание задаётся манипуляторами left, right и internal. Чтобы установить поведение по умолчанию (столько символов, сколько необходимо), нужно использовать манипулятор setw с параметром . Влияет только на одно вводимое/выводимое значение!
showbase Вывод префиксов и для обозначения системы счисления.
showpoint Вывод и целой, и дробной частей вещественного числа, даже если дробная часть равна 0.
showpos Вывод знака перед положительным числом.
skipws Пробелы рассматриваются как разделители между значениями. Используется по умолчанию
uppercase Шестнадцатеричные цифры и символ экспоненты в научном формате вещественного числа выводятся прописными буквами.
int m, n, x; double y; cin >> m >> n; cout > x; cout > y; cout char c; cout > c;

Как нам гарантировать, что слова Введите символ появятся на экране прежде, чем будет выполнена операция считывания? Вывод в стандартный поток буферизуется, так что если потоки cin и cout не зависимы, то выводимый текст не появится на экране, пока не заполнится буфер вывода. Решение этой задачи заключается в том, что потоки связываются с помощью функции tie. Эта функция используется для того, чтобы устанавливать и разрывать связи между потоками ввода и вывода.
char c; cin.tie(&cout); cout > c;

В каждый момент времени поток ввода может быть связан только с одним потоком вывода. Обращение s.tie(0) разрывает связь между потоком s и потоком, с которым он был связан. Как и большинство функций с потоками, устанавливающих значение, функция tie возвращает прежнее значение, т.е. она возвращает предыдущий связанный поток или 0. При вызове без аргументов функция tie() возвращает текущий связанный поток, не изменяя его.

2.4. Файловые потоки

Для ввода/вывода из файла/в файл существуют потоки, которые могут быть связаны с файлом на диске. Для использования файловых потоков необходимо включить заголовочный файл . Существует три разновидности файловых потоков: fstream, ifstream и ofstream. Разница между ними состоит в том, что поток fstream по умолчанию открывается для ввода и вывода, поток ifstream по умолчанию открывается для ввода, а поток ofstream по умолчанию открывается для вывода. Изменить поведение по умолчанию, а также задать другие режимы открытия файла можно с помощью следующих констант:

  • ios_base::app – открытие файла для добавления;
  • ios_base::binary – открытие двоичного, а не текстового файла;
  • ios_base::in – открытие файла для чтения;
  • ios_base::out – открытие файла для записи;
  • ios_base::trunc – удаление содержимого файла при открытии.

Режимы открытия файла комбинируются с помощью операции поразрядного ИЛИ (|).

Для открытия файла можно задать имя файла непосредственно в конструкторе потока или воспользоваться функцией open.

fstream fs(«f1.txt»); // Открытие файла для чтения и записи
ifstream ifs(«f2.txt»); // Открытие файла для чтения
ofstream ofs(«f3.txt»); // Открытие файла для записи
fstream fs(«f1.txt», ios_base::in | ios_base::out | ios_base::trunk); // Открытие файла для чтения и записи с удалением содержимого файла
ifstream ifs(«f2.txt», ios_base::in | ios_base::binary); // Открытие двоичного файла для чтения
ofstream ofs; // Создаём поток, не связанный с файлом
ofs.open(«f3.txt»); // Открываем файл для записи

Если вы планируете использовать файл только для чтения или только для записи безопаснее воспользоваться соответствующим файловым потоком.

Для проверки открытия файла служит функция is_open.

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

Для работы с текстовыми потоками используются операции >. Также возможно использование манипуляторов для форматирования вводимых/выводимых значений.

int x; fstream f;
f.open(«in.txt», ios_base::in); // Открываем файл для чтения
if (!f.is_open()) // Проверяем открытие файла
f >> x; // Чтение переменной x из файла
if (f.fail()) // Проверка ошибок чтения
f.close(); // Закрываем файл
f.open(«out.txt», ios_base::out); // Снова открываем файл, теперь для записи
if (!f.is_open()) // Проверяем открытие файла
f int n; ifstream f(«in.txt»);
if (!f.is_open())
while (!f.eof()) // Пока не достигнут конец файла
< f >> n; cout ios_base::beg – начало файла;
  • ios_base::cur – текущая позиция указателя;
  • ios_base::end – конец файла.

  • Функции tellg/tellp не имеют параметров. Они возвращают текущую позицию указателя в файле.

    Функции seekg/seekp и tellg/tellp работают как с текстовыми, так и с двоичными потоками. В любом случае желательно либо знать структуру файла, либо работать с файлами, все записи в которых имеют одинаковую длину. В противном случае возможно перемещение указателя на позицию, не являющуюся началом записи.

    Для работы с двоичными файлами используются функции read и write. В качестве параметров функции получают указатель (типа char* для функции read и типа const char* для функции write), который задаёт адрес начала массива для ввода/вывода, и целое число, задающее количество байт для ввода/вывода.

    Пример использования потокового ввода из двоичного файла см. в конце лекции.

    Документация

    Формат вывода

    MATLAB ® отображает вывод и в Командном окне и в Live Editor. Формат вывода можно изменить при помощи нескольких настроек.

    Интервал строки форматов в Выводе

    По умолчанию, отображения MATLAB очищает строки в командном окне вывод.

    Можно выбрать одну из двух опций цифрового дисплея в MATLAB.

    loose — Сохраняет отображение пустых строк (значение по умолчанию).

    compact — Подавляет отображение пустых строк.

    Чтобы отформатировать выходное отображение, выполнить одно из следующих действий:

    На вкладке «Главная страница (Home)» в разделе «Конфигурация (Environment)» нажмите «Настройки (Preferences)». Выберите MATLAB> Command Window, и затем выберите опцию Numeric display.

    Используйте функцию format в командной строке, например:

    Примечание

    Параметры экрана межстрочного интервала не применяются в Live Editor.

    Числа с плавающей запятой формата

    Можно изменить способ, которым числа отображаются и в Командном окне и в Live Editor. По умолчанию MATLAB использует формат short (5-разрядные масштабированные значения фиксированной точки).

    Например, предположите, что вы вводите x = [4/3 1.2345e-6] в Командном окне. Отображение вывода MATLAB зависит от формата, который вы выбрали. Эта таблица показывает некоторые доступные форматы цифрового дисплея, и их соответствующий вывод.

    short (значение по умолчанию)

    x = 1.3333e+00 1.2345e-06

    x = 1.333333333333333 0.000001234500000

    Примечание

    Текстовый формат отображения влияет только, как числа показывают, не то, как MATLAB вычисляет или сохраняет их.

    Чтобы отформатировать путь, числа отображаются, выполнить одно из следующих действий:

    На вкладке «Главная страница (Home)» в разделе «Конфигурация (Environment)» нажмите «Настройки (Preferences)». Выберите MATLAB> Command Window, и затем выберите опцию Numeric format.

    Используйте функцию format , например:

    Смотрите страницу с описанием format для списка и описания всех поддерживаемых числовых форматов.

    Перенос строк кода, чтобы соответствовать ширине окна

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

    На вкладке «Главная страница (Home)» в разделе «Конфигурация (Environment)» нажмите «Настройки (Preferences)». Выберите MATLAB> Command Window.

    Выберите Wrap Lines.

    Примечание

    Опции переноса строки не применяются в Live Editor.

    Подавление Вывода

    Чтобы подавить код вывод, добавьте точку с запятой (;) в конец команды. Это полезно, когда код генерирует большие матрицы.

    Выполнение следующего кода создает A , но не показывает получившуюся матрицу в Командном окне или Live Editor:

    Просмотр постраничного вывода

    Вывод в Командном окне может превысить видимый фрагмент окна. Можно просмотреть вывод, один экран за один раз:

    В Командном окне введите more on , чтобы включить разбитый на страницы вывод.

    Введите команду, которая генерирует крупносерийное производство.

    Совершенствуйтесь к следующей строке путем нажатия Enter.

    Совершенствуйтесь к следующей странице путем нажатия Space Bar.

    Прекратите отображать вывод путем нажатия q.

    Чтобы отключить разбитый на страницы вывод, введите more off .

    Примечание

    Разбитые на страницы выходные опции не применяются в Live Editor.

    Очищение командного окна

    Если Командное окно кажется нарушенным, можно очистить весь текст (не очищая рабочую область) путем выполнения одного из следующих действий:


    На вкладке Home, в разделе Code, выбирают Clear Commands> Command Window, чтобы очистить буфер прокрутки Командного окна.

    Используйте функцию clc , чтобы очистить буфер прокрутки Командного окна.

    Используйте функцию home , чтобы очистить ваше текущее представление Командного окна, не очищая буфер прокрутки.

    Смотрите также

    Документация MATLAB
    Поддержка

    © 1994-2020 The MathWorks, Inc.

    1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

    2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

    3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.

    4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

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

    Обзор средств ввода-вывода в C++

    Приложение, написанное на любом языке программирования, должно взаимодействовать с окружающим миром. Иначе пользы от него не будет. Как правило, такое взаимодействие осуществляется посредством ввода-вывода информации на монитор или в файл. Правда, есть некоторое множество программ, которые не используют файловый или консольный ввод-вывод: это программы, осуществляющие низкоуровневое взаимодействие с аппаратной частью компьютера и периферией (ядро ОС, драйверы и пр.), но это уже экзотика.

    В стандартном C++ существует два основных пути ввода-вывода информации: с помощью потоков, реализованных в STL (Standard Template Library) и посредством традиционной системы ввода-вывода, унаследованной от C. Если копнуть немного глубже, то окажется, что и потоки, и традиционная система ввода-вывода для осуществления необходимых действий используют вызовы операционной системы. И это правильно.

    Дальнейшее изложение не претендует на полноту, но описывает основные принципы использования библиотек. Подробности использования можно посмотреть в многочисленной литературе по C++ и STL, в MSDN и пр.

    Традиционный ввод-вывод

    Для использования традиционного ввода-вывода в духе C, в программу необходимо включить заголовочный файл . (Разумеется, компилятор должен иметь доступ к соответствующей объектной библиотеке для правильной сборки исполняемого файла.)

    Библиотека stdio предоставляет необходимый набор функций для ввода и вывода информации как в текстовом, так и в двоичном представлении. Следует отметить, что в отличие от классической C‑библиотеки, в современных библиотеках имеются более безопасные аналоги «классических» функций. Как правило, они имеют такое же имя, к которому добавлен суффикс _s. Рекомендуется использовать именно эти, безопасные функции.

    Самая Первая Программа с использованием библиотеки stdio выглядит так:

    При запуске консольного приложения неявно открываются три потока: stdin — для ввода с клавиатуры, stdout — для буферизованного вывода на монитор и stderr — для небуферизованного вывода на монитор сообщений об ошибках. Эти три символа определены посредством .

    В stdio для консольного ввода-вывода предусмотрена отдельная группа функций. Однако эти функции, как правило, являются обёртками для аналогичных функций файлового ввода-вывода, для которых аргумент типа FILE задан по умолчанию.

    Самая Первая Программа с использование файлового вывода из библиотеки stdio выглядит так:

    Некоторые популярные функции из stdio:

    Сущность FILE представляет собой структуру, в которой хранится вся информация для управления потоком ввода-вывода.

    Файл открывается функцией fopen(), которой передаются два параметра. Первый параметр определяет имя файла. Второй — определяет режим открытия файла: чтение, запись, произвольный доступ и т.п., а также указание на то, как работать с данными: в текстовом или двоичном режиме. Подробности — см. в документации.

    Пример использования stdio

    Следует отметить, что существует еще одна библиотека, ориентированная исключительно на консольный ввод-вывод — .

    Ввод-вывод с помощью потоков STL

    Для использования объектно-ориентированного консольного ввода-вывода с помощью потоков (stream) STL в программу необходимо включить заголовочный файл , а для файлового ещё и . (Разумеется, компилятор должен иметь доступ к соответствующей объектной библиотеке для правильной сборки исполняемого файла.)

    Самая Первая Программа с использованием потоков STL выглядит так:

    При запуске консольного приложения неявно открываются четыре потока: сin — для ввода с клавиатуры, сout — для буферизованного вывода на монитор, сerr — для небуферизованного вывода на монитор сообщений об ошибках и clog — буферизованный аналог cerr. Эти четыре символа определены посредством .

    Потоки cin, cout и cerr соответствуют потокам stdin, stdout и stderr соответственно.

    Иерархия классов ввода-вывода STL достаточно сложна. Любители тонких ощущений могут найти её описание в литературе. Впрочем, остальных также не минует чаша сия, но только позже, когда потребуются знания чуть повыше того базового уровня, который описывается здесь.

    Для ввода-вывода сначала необходимо создать поток — экземпляр соответствующего класса STL, а затем связать его с файлом. Для потока вывода используется класс ofstream, для потока ввода — ifstream, для потока ввода-вывода — fstream. В каждом из этих классов есть метод open(), который связывает поток с файлом. Проще говоря, открывает файл. Методу передаются два параметра: имя файла и режим открытия файла. Второй параметр представляет собой набор битовых флагов, определяющих режим открытия файла (чтение, запись и пр.) и способ работы с данными (текстовый или двоичный режим). Второй параметр опционален, т.е. имеет значение по умолчанию, соответствующее классу.

    Вышеупомянутые классы имеют также конструкторы, позволяющие открыть файл сразу при создании потока. Параметры этих конструкторов полностью совпадают с параметрами метода open().

    При ошибке открытия файла (в контексте логического выражения) поток получает значение false.

    Файл закрывается методом close(). Этот метод также вызывается при разрушении экземпляров классов потоков.

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

    Некоторые наиболее употребляемые методы:

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

    Взаимодействие потокового и традиционного ввода-вывода

    Апологеты C++ рекомендуют использовать для ввода-вывода только потоки STL и отказаться от использования традиционного ввода-вывода в духе C. Однако, ничто не мешает, по крайней мере пока, использовать традиционную систему ввода-вывода. Более того, предусмотрена специальная функция для синхронизации ввода-вывода, выполненного посредством потоков и посредством старых функций.

    Заключение

    Какой механизм использовать — вопрос предпочтений программиста, если работодателем явно не предписано использование конкретного механизма. В любом случае для физического ввода-вывода используются вызовы операционной системы. Всё остальное — обёртка, набор более или менее удобных функций или классов для взаимодействия с ОС.

    Использование механизма потоков считается более безопасным. Но, как известно, плохую программу можно написать на любом языке программирования. Это также относится и к использованию библиотек. Автор статьи: Череп.

    Форматированный ввод и вывод

    Форматированный вывод

    Сегодня мы рассмотрим две важные функции форматированного ввода и вывода. Устройство и работу этих функций полностью можно понять только после изучения работы с указателями и функций с переменным числом параметров. Но пользоваться этими функциями необходимо уже сейчас, так что некоторые моменты придётся пропустить.

    Функция форматированного вывода printf получает в качестве аргументов строку формат и аргументы, которые необходимо вывести в соответствии с форматом, и возвращает число выведенных символов. В случае ошибки возвращает отрицательное значение и устанавливает значение ferror. Если произошло несколько ошибок, errno равно EILSEQ.
    int printf (const char * format, . );

    Функция проходит по строке и заменяет первое вхождение % на первый аргумент, второе вхождение % на второй аргумент и т.д. Далее мы будем просто рассматривать список флагов и примеры использования.

    Общий синтаксис спецификатора формата
    %[флаги][ширина][.точность][длина]спецификатор
    Спецификатор – это самый важный компонент. Он определяет тип переменной и способ её вывода.

    Формат цифрового дисплея Пример Вывод
    Таб. 1 Спецификатор типа.

    Спецификатор Что хотим вывести Пример
    d или i Целое со знаком в в десятичном виде 392
    u Целое без знака в десятичном виде 7235
    o Беззнаковое в восьмеричном виде 657
    x Беззнаковое целое в шестнадцатеричном виде 7fa
    X Беззнаковое целое в шестнадцатеричном виде, верхний регистр 7FA
    f или F Число с плавающей точкой 3.4563745
    e Экспоненциальная форма для числа с плавающей точкой 3.1234e+3
    E Экспоненциальная форма для числа с плавающей точкой, верхний регистр 3.1234E+3
    g Кратчайшее из представлений форматов f и e 3.12
    G Кратчайшее из представлений форматов F и E 3.12
    a Шестнадцатеричное представление числа с плавающей точкой -0xc.90fep-2
    A Шестнадцатеричное представление числа с плавающей точкой, верхний регистр -0xc.90FEP-2
    c Буква a
    s Строка (нуль-терминированный массив букв) Hello World
    p Адрес указателя b8000000
    n Ничего не пачатает. Аргументом должен быть указатель на signed int. По этому адресу будет сохранено количество букв, которое было выведено до встречи %n
    % Два идущих друг за другом процента выводят знак процента %


    Строка формата также может включать в себя следующие необязательные суб-спецификаторы: флаг, ширина, .точность и модификатор (именно в таком порядке).

    Таб. 2 Флаги.

    Флаг Описание
    Выключка влево на заданное шириной значение
    + Явно указывать знак у числа, даже для положительных чисел
    (пробел) Если знак не будет выведен, то вставляет пробел перед выводимым числом
    # Когда используется вместе с o, x или X, вставляет перед числом 0, 0x или 0X
    Когда используется со спецификаторами a, A, e, E, f, F, g или G, вставляет десятичную точку, даже если после неё нет десятичных знаков.
    Вставляет нули, когда объявлен спецификатор ширины
    Таб. 3 Ширина.
    Ширина Описание
    (число) Минимальное количество знаков, которое необходимо вывести. Если в числе меньше знаков, то вставляет пробелы (или нули)
    * Ширина не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу
    Таб. 4 Точность.
    .Точность Описание
    .число Для спецификаторов целых (d, i, o, u, x, X) точность определяет минимальное количество знаков, которое необходимо вывести. Если значение короче, то выводятся нули перед числом. Значение не обрезается, даже если оно длиннее. Точночть 0 означает, что для значения 0 ничего не выводится.
    Для спецификаторов чисел с плавающей точкой (a, A, e, E, f, F) это число знаков, которые необходимо вывести после десятичной точки (по умолчанию 6).
    Для g и G — это число значащих разрядов, которые необходимо вывести.
    Для s — выводится указанное число символов. По умолчанию выводятся все символы до первого нулевого.
    Если число не стоит, то по умолчанию точность равна 0
    .* Точность не указана в строке формата, она передаётся отдельно в виде аргумента, который должен предшествовать выводимому числу

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

    Таб. 5 Длина.

    спецификаторы
    Длина d, i u o x X f F e E g G a A c s p n
    (none) int unsigned int double int char* void* int*
    hh signed char unsigned char signed char*
    h short int unsigned short int short int*
    l long int unsigned long int wint_t wchar_t* long int*
    ll long long int unsigned long long int long long int*
    j intmax_t uintmax_t intmax_t*
    z size_t size_t size_t*
    t ptrdiff_t ptrdiff_t ptrdiff_t*
    L long double

    Форматированный ввод

    Рассмотрим форматированный ввод функцией scanf.
    int scanf(const char*, . )
    Функция принимает строку формата ввода (она похожа на строку формата printf) и адреса, по которым необходимо записать считанные данные. Возвращает количество успешно проинициализированных аргументов.
    Формат спецификатора ввода
    %[*][ширина][длинна]спецификатор

    Таб. 6 Спецификатор типа.

    Спецификатор Описание Выбранные символы
    i, u Целые Произвольное число цифр (0-9), возможно, начинающихся с + или -. Если число начинается с 0, то считывается в восьмеричном формате, если с 0x, то в шестнадцатеричном.
    d Десятичное целое Произвольное число цифр (0-9), возможно, начинающихся с + или -.
    o восьмеричное целое Произвольное число цифр (0-7), возможно, начинающихся с + или -.
    x Шестнадцатеричное целое Произвольное число цифр (0-F), возможно, начинающихся с + или — и префикса 0x или 0X.
    f, e, g Число с плавающей точкой Число, состоящее из набора цифр 0-9, возможно с десятичным разделителем (точкой). Возможно также представление в экспоненциальной форме. C99 позволяет также вводить число в шестнадцатеричном формате.
    a
    c Символ Если ширина не передана, то считывает один символ. Если ширина передана, то считывает нужное количество символов и размещает их в массиве БЕЗ терминального символа на конце.
    s Строка Считывает все не пробельные символы. Если указана ширина, то не более n символов. Ставит на место n+1 символа терминальный.
    p Адрес указателя Последовательность символов, трактуемая как адрес указателя. Формат зависит от реализации, но совпадает с тем, как выводит printf с ключом p
    [символы] Множество символов Считывает только те символы, которые записаны в квадратных скобках, С99
    [^символы] Множество символов Считывает только те символы, которые не указаны в квадратных скобках, С99
    n Ничего не считывает Сохраняет число уже считанных символов по указанному адресу

    Как и в printf, ширина, заданная символом * ожидает аргумента, который будт задавать ширину. Флаг длина совпадает с таким флагом функции printf.

    Кроме функций scanf и printf есть ещё ряд функций, которые позволяют получать вводимые данные

    int getch() [aka _getch(), getchar()] — возвращает введённый символ, при этом не выводит его на консоль.

    char * fgets ( char * str, int num, FILE * stream ) — функция позволяет считывать строку с пробельными символами. Несмотря на то, что она работает с файлом, можно с её помощью считывать и из стандартного потока ввода. Её преимущество относительно gets в том, что она позволяет указать максимальный размер считываемой строки и заканчивает строку терминальным символом.

    Это не полный набор различных функций символьного ввода и вывода. Таких функций море, но очень многие из них небезопасны, поэтому перед использованием внимательно читайте документацию.

    Непечатные символы

    В си определён ряд символов, которые не выводятся на печать, но позволяют производить форматирование вывода. Эти символы можно задавать в виде численных значений, либо в виде эскейп-последовательностей: символа, экранированного обратным слешем.

    Перенаправление ввода вывода Linux

    Одна из самых интересных и полезных тем для системных администраторов и новых пользователей, которые только начинают разбираться в работе с терминалом — это перенаправление потоков ввода вывода Linux. Эта особенность терминала позволяет перенаправлять вывод команд в файл, или содержимое файла на ввод команды, объединять команды вместе, и образовать конвейеры команд.

    В этой статье мы рассмотрим как выполняется перенаправление потоков ввода вывода в Linux, какие операторы для этого используются, а также где все это можно применять.

    Как работает перенаправление ввода вывода

    Все команды, которые мы выполняем, возвращают нам три вида данных:

    • Результат выполнения команды, обычно текстовые данные, которые запросил пользователь;
    • Сообщения об ошибках — информируют о процессе выполнения команды и возникших непредвиденных обстоятельствах;
    • Код возврата — число, которое позволяет оценить правильно ли отработала программа.

    В Linux все субстанции считаются файлами, в том числе и потоки ввода вывода linux — файлы. В каждом дистрибутиве есть три основных файла потоков, которые могут использовать программы, они определяются оболочкой и идентифицируются по номеру дескриптора файла:

    • STDIN или 0 — этот файл связан с клавиатурой и большинство команд получают данные для работы отсюда;
    • STDOUT или 1 — это стандартный вывод, сюда программа отправляет все результаты своей работы. Он связан с экраном, или если быть точным, то с терминалом, в котором выполняется программа;
    • STDERR или 2 — все сообщения об ошибках выводятся в этот файл.

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

    Перенаправить вывод в файл

    Все очень просто. Вы можете перенаправить вывод в файл с помощью символа >. Например, сохраним вывод команды top:

    top -bn 5 > top.log

    Опция -b заставляет программу работать в не интерактивном пакетном режиме, а n — повторяет операцию пять раз, чтобы получить информацию обо всех процессах. Теперь смотрим что получилось с помощью cat:

    Символ «>» перезаписывает информацию из файла, если там уже что-то есть. Для добавления данных в конец используйте «>>». Например, перенаправить вывод в файл linux еще для top:

    top -bn 5 >> top.log

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

    top -bn 5 1>top.log

    Перенаправить ошибки в файл

    Чтобы перенаправить вывод ошибок в файл вам нужно явно указать дескриптор файла, который собираетесь перенаправлять. Для ошибок — это номер 2. Например, при попытке получения доступа к каталогу суперпользователя ls выдаст ошибку:

    Вы можете перенаправить стандартный поток ошибок в файл так:

    ls -l /root/ 2> ls-error.log
    $ cat ls-error.log

    Чтобы добавить данные в конец файла используйте тот же символ:

    ls -l /root/ 2>>ls-error.log

    Перенаправить стандартный вывод и ошибки в файл

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

    ls -l /root/ >ls-error.log 2>&1

    Сначала будет отправлен вывод команды ls в файл ls-error.log c помощью первого символа перенаправления. Дальше в тот же самый файл будут направлены все ошибки. Второй метод проще:

    ls -l /root/ &> ls-error.log

    Также можно использовать добавление вместо перезаписи:

    ls -l /root/ &>> ls-error.log

    Стандартный ввод из файла

    Большинство программ, кроме сервисов, получают данные для своей работы через стандартный ввод. По умолчанию стандартный ввод ожидает данных от клавиатуры. Но вы можете заставить программу читать данные из файла с помощью оператора » cat

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

    Таким образом, мы в одной команде перенаправляем ввод вывод linux.

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

    Можно работать не только с файлами, но и перенаправлять вывод одной команды в качестве ввода другой. Это очень полезно для выполнения сложных операций. Например, выведем пять недавно измененных файлов:


    ls -lt | head -n 5

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

    echo test/ tmp/ | xargs -n 1 cp -v testfile.sh

    Здесь параметр -n 1 задает, что для одной команды нужно подставлять только один параметр, а опция -v в cp позволяет выводить подробную информацию о перемещениях. Еще одна, полезная в таких случаях команда — это tee. Она читает данные из стандартного ввода и записывает в стандартный вывод или файлы. Например:

    echo «Тест работы tee» | tee file1

    В сочетании с другими командами все это может использоваться для создания сложных инструкций из нескольких команд.

    Выводы

    В этой статье мы рассмотрели основы перенаправления потоков ввода вывода Linux. Теперь вы знаете как перенаправить вывод в файл linux или вывод из файла. Это очень просто и удобно. Если у вас остались вопросы, спрашивайте в комментариях!

    Bash-скрипты, часть 4: ввод и вывод

    В прошлый раз, в третьей части этой серии материалов по bash-скриптам, мы говорили о параметрах командной строки и ключах. Наша сегодняшняя тема — ввод, вывод, и всё, что с этим связано.

    Вы уже знакомы с двумя методами работы с тем, что выводят сценарии командной строки:

    • Отображение выводимых данных на экране.
    • Перенаправление вывода в файл.

    Иногда что-то надо показать на экране, а что-то — записать в файл, поэтому нужно разобраться с тем, как в Linux обрабатывается ввод и вывод, а значит — научиться отправлять результаты работы сценариев туда, куда нужно. Начнём с разговора о стандартных дескрипторах файлов.

    Стандартные дескрипторы файлов

    Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов.

    Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.

    • 0 , STDIN — стандартный поток ввода.
    • 1 , STDOUT — стандартный поток вывода.
    • 2 , STDERR — стандартный поток ошибок.

    Эти три специальных дескриптора обрабатывают ввод и вывод данных в сценарии.
    Вам нужно как следует разобраться в стандартных потоках. Их можно сравнить с фундаментом, на котором строится взаимодействие скриптов с внешним миром. Рассмотрим подробности о них.

    STDIN

    STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда в сценариях используют символ перенаправления ввода — , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

    Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .

    Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран.

    STDOUT

    STDOUT — стандартный поток вывода оболочки. По умолчанию это — экран. Большинство bash-команд выводят данные в STDOUT , что приводит к их появлению в консоли. Данные можно перенаправить в файл, присоединяя их к его содержимому, для этого служит команда >> .

    Итак, у нас есть некий файл с данными, к которому мы можем добавить другие данные с помощью этой команды:

    То, что выведет pwd , будет добавлено к файлу myfile , при этом уже имеющиеся в нём данные никуда не денутся.

    Перенаправление вывода команды в файл

    Пока всё хорошо, но что если попытаться выполнить что-то вроде показанного ниже, обратившись к несуществующему файлу xfile , задумывая всё это для того, чтобы в файл myfile попало сообщение об ошибке.

    После выполнения этой команды мы увидим сообщения об ошибках на экране.

    Попытка обращения к несуществующему файлу

    При попытке обращения к несуществующему файлу генерируется ошибка, но оболочка не перенаправила сообщения об ошибках в файл, выведя их на экран. Но мы-то хотели, чтобы сообщения об ошибках попали в файл. Что делать? Ответ прост — воспользоваться третьим стандартным дескриптором.

    STDERR

    STDERR представляет собой стандартный поток ошибок оболочки. По умолчанию этот дескриптор указывает на то же самое, на что указывает STDOUT , именно поэтому при возникновении ошибки мы видим сообщение на экране.

    Итак, предположим, что надо перенаправить сообщения об ошибках, скажем, в лог-файл, или куда-нибудь ещё, вместо того, чтобы выводить их на экран.

    ▍Перенаправление потока ошибок

    Как вы уже знаете, дескриптор файла STDERR — 2. Мы можем перенаправить ошибки, разместив этот дескриптор перед командой перенаправления:

    Сообщение об ошибке теперь попадёт в файл myfile .

    Перенаправление сообщения об ошибке в файл

    ▍Перенаправление потоков ошибок и вывода

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

    Перенаправление ошибок и стандартного вывода

    Оболочка перенаправит то, что команда ls обычно отправляет в STDOUT , в файл correctcontent благодаря конструкции 1> . Сообщения об ошибках, которые попали бы в STDERR , оказываются в файле errorcontent из-за команды перенаправления 2> .

    Если надо, и STDERR , и STDOUT можно перенаправить в один и тот же файл, воспользовавшись командой &> :

    Перенаправление STDERR и STDOUT в один и тот же файл

    После выполнения команды то, что предназначено для STDERR и STDOUT , оказывается в файле content .

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

    Существует два метода перенаправления вывода в сценариях командной строки:

    • Временное перенаправление, или перенаправление вывода одной строки.
    • Постоянное перенаправление, или перенаправление всего вывода в скрипте либо в какой-то его части.

    ▍Временное перенаправление вывода

    В скрипте можно перенаправить вывод отдельной строки в STDERR . Для того, чтобы это сделать, достаточно использовать команду перенаправления, указав дескриптор STDERR , при этом перед номером дескриптора надо поставить символ амперсанда ( & ):

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


    Запустим скрипт так, чтобы вывод STDERR попадал в файл.

    Как видно, теперь обычный вывод делается в консоль, а сообщения об ошибках попадают в файл.

    Сообщения об ошибках записываются в файл

    ▍Постоянное перенаправление вывода

    Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять соответствующую команду к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :

    Перенаправление всего вывода в файл

    Если просмотреть файл, указанный в команде перенаправления вывода, окажется, что всё, что выводилось командами echo , попало в этот файл.

    Команду exec можно использовать не только в начале скрипта, но и в других местах:

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

    Перенаправление вывода в разные файлы

    Сначала команда exec задаёт перенаправление вывода из STDERR в файл myerror . Затем вывод нескольких команд echo отправляется в STDOUT и выводится на экран. После этого команда exec задаёт отправку того, что попадает в STDOUT , в файл myfile , и, наконец, мы пользуемся командой перенаправления в STDERR в команде echo , что приводит к записи соответствующей строки в файл myerror.

    Освоив это, вы сможете перенаправлять вывод туда, куда нужно. Теперь поговорим о перенаправлении ввода.

    Перенаправление ввода в скриптах

    Для перенаправления ввода можно воспользоваться той же методикой, которую мы применяли для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:

    Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл myfile , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:

    Вот что появится на экране после запуска скрипта.

    В одном из предыдущих материалов вы узнали о том, как использовать команду read для чтения данных, вводимых пользователем с клавиатуры. Если перенаправить ввод, сделав источником данных файл, то команда read , при попытке прочитать данные из STDIN , будет читать их из файла, а не с клавиатуры.

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

    Создание собственного перенаправления вывода

    Перенаправляя ввод и вывод в сценариях, вы не ограничены тремя стандартными дескрипторами файлов. Как уже говорилось, можно иметь до девяти открытых дескрипторов. Остальные шесть, с номерами от 3 до 8, можно использовать для перенаправления ввода или вывода. Любой из них можно назначить файлу и использовать в коде скрипта.

    Назначить дескриптор для вывода данных можно, используя команду exec :

    После запуска скрипта часть вывода попадёт на экран, часть — в файл с дескриптором 3 .

    Перенаправление вывода, используя собственный дескриптор

    Создание дескрипторов файлов для ввода данных

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

    После окончания чтения файла можно восстановить STDIN и пользоваться им как обычно:

    В этом примере дескриптор файла 6 использовался для хранения ссылки на STDIN . Затем было сделано перенаправление ввода, источником данных для STDIN стал файл. После этого входные данные для команды read поступали из перенаправленного STDIN , то есть из файла.

    После чтения файла мы возвращаем STDIN в исходное состояние, перенаправляя его в дескриптор 6 . Теперь, для того, чтобы проверить, что всё работает правильно, скрипт задаёт пользователю вопрос, ожидает ввода с клавиатуры и обрабатывает то, что введено.

    Закрытие дескрипторов файлов

    Оболочка автоматически закрывает дескрипторы файлов после завершения работы скрипта. Однако, в некоторых случаях нужно закрывать дескрипторы вручную, до того, как скрипт закончит работу. Для того, чтобы закрыть дескриптор, его нужно перенаправить в &- . Выглядит это так:

    После исполнения скрипта мы получим сообщение об ошибке.

    Попытка обращения к закрытому дескриптору файла

    Всё дело в том, что мы попытались обратиться к несуществующему дескриптору.

    Будьте внимательны, закрывая дескрипторы файлов в сценариях. Если вы отправляли данные в файл, потом закрыли дескриптор, потом — открыли снова, оболочка заменит существующий файл новым. То есть всё то, что было записано в этот файл ранее, будет утеряно.

    Получение сведений об открытых дескрипторах

    Для того, чтобы получить список всех открытых в Linux дескрипторов, можно воспользоваться командой lsof . Во многих дистрибутивах, вроде Fedora, утилита lsof находится в /usr/sbin . Эта команда весьма полезна, так как она выводит сведения о каждом дескрипторе, открытом в системе. Сюда входит и то, что открыли процессы, выполняемые в фоне, и то, что открыто пользователями, вошедшими в систему.

    У этой команды есть множество ключей, рассмотрим самые важные.

    • -p Позволяет указать ID процесса.
    • -d Позволяет указать номер дескриптора, о котором надо получить сведения.

    Для того, чтобы узнать PID текущего процесса, можно использовать специальную переменную окружения $$ , в которую оболочка записывает текущий PID .

    Ключ -a используется для выполнения операции логического И над результатами, возвращёнными благодаря использованию двух других ключей:

    Вывод сведений об открытых дескрипторах

    Тип файлов, связанных с STDIN , STDOUT и STDERR — CHR (character mode, символьный режим). Так как все они указывают на терминал, имя файла соответствует имени устройства, назначенного терминалу. Все три стандартных файла доступны и для чтения, и для записи.

    Посмотрим на вызов команды lsof из скрипта, в котором открыты, в дополнение к стандартным, другие дескрипторы:

    Вот что получится, если этот скрипт запустить.

    Просмотр дескрипторов файлов, открытых скриптом

    Скрипт открыл два дескриптора для вывода ( 3 и 6 ) и один — для ввода ( 7 ). Тут же показаны и пути к файлам, использованных для настройки дескрипторов.

    Подавление вывода

    Иногда надо сделать так, чтобы команды в скрипте, который, например, может исполняться как фоновый процесс, ничего не выводили на экран. Для этого можно перенаправить вывод в /dev/null . Это — что-то вроде «чёрной дыры».

    Вот, например, как подавить вывод сообщений об ошибках:

    Тот же подход используется, если, например, надо очистить файл, не удаляя его:

    Итоги

    Сегодня вы узнали о том, как в сценариях командной строки работают ввод и вывод. Теперь вы умеете обращаться с дескрипторами файлов, создавать, просматривать и закрывать их, знаете о перенаправлении потоков ввода, вывода и ошибок. Всё это очень важно в деле разработки bash-скриптов.


    В следующий раз поговорим о сигналах Linux, о том, как обрабатывать их в сценариях, о запуске заданий по расписанию и о фоновых задачах.

    Уважаемые читатели! В этом материале даны основы работы с потоками ввода, вывода и ошибок. Уверены, среди вас есть профессионалы, которые могут рассказать обо всём этом то, что приходит лишь с опытом. Если так — передаём слово вам.

    Документация

    Формат вывода

    MATLAB ® отображает вывод и в Командном окне и в Live Editor. Формат вывода можно изменить при помощи нескольких настроек.

    Интервал строки форматов в Выводе

    По умолчанию, отображения MATLAB очищает строки в командном окне вывод.

    Можно выбрать одну из двух опций цифрового дисплея в MATLAB.

    loose — Сохраняет отображение пустых строк (значение по умолчанию).

    compact — Подавляет отображение пустых строк.

    Чтобы отформатировать выходное отображение, выполнить одно из следующих действий:

    На вкладке «Главная страница (Home)» в разделе «Конфигурация (Environment)» нажмите «Настройки (Preferences)». Выберите MATLAB> Command Window, и затем выберите опцию Numeric display.

    Используйте функцию format в командной строке, например:

    Примечание

    Параметры экрана межстрочного интервала не применяются в Live Editor.

    Числа с плавающей запятой формата

    Можно изменить способ, которым числа отображаются и в Командном окне и в Live Editor. По умолчанию MATLAB использует формат short (5-разрядные масштабированные значения фиксированной точки).

    Например, предположите, что вы вводите x = [4/3 1.2345e-6] в Командном окне. Отображение вывода MATLAB зависит от формата, который вы выбрали. Эта таблица показывает некоторые доступные форматы цифрового дисплея, и их соответствующий вывод.

    short (значение по умолчанию)

    x = 1.3333e+00 1.2345e-06

    x = 1.333333333333333 0.000001234500000

    Примечание

    Текстовый формат отображения влияет только, как числа показывают, не то, как MATLAB вычисляет или сохраняет их.

    Чтобы отформатировать путь, числа отображаются, выполнить одно из следующих действий:

    На вкладке «Главная страница (Home)» в разделе «Конфигурация (Environment)» нажмите «Настройки (Preferences)». Выберите MATLAB> Command Window, и затем выберите опцию Numeric format.

    Используйте функцию format , например:

    Смотрите страницу с описанием format для списка и описания всех поддерживаемых числовых форматов.

    Перенос строк кода, чтобы соответствовать ширине окна

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

    На вкладке «Главная страница (Home)» в разделе «Конфигурация (Environment)» нажмите «Настройки (Preferences)». Выберите MATLAB> Command Window.

    Выберите Wrap Lines.

    Примечание

    Опции переноса строки не применяются в Live Editor.

    Подавление Вывода

    Чтобы подавить код вывод, добавьте точку с запятой (;) в конец команды. Это полезно, когда код генерирует большие матрицы.

    Выполнение следующего кода создает A , но не показывает получившуюся матрицу в Командном окне или Live Editor:

    Просмотр постраничного вывода

    Вывод в Командном окне может превысить видимый фрагмент окна. Можно просмотреть вывод, один экран за один раз:

    В Командном окне введите more on , чтобы включить разбитый на страницы вывод.

    Введите команду, которая генерирует крупносерийное производство.

    Совершенствуйтесь к следующей строке путем нажатия Enter.

    Совершенствуйтесь к следующей странице путем нажатия Space Bar.

    Прекратите отображать вывод путем нажатия q.

    Чтобы отключить разбитый на страницы вывод, введите more off .

    Примечание

    Разбитые на страницы выходные опции не применяются в Live Editor.

    Очищение командного окна

    Если Командное окно кажется нарушенным, можно очистить весь текст (не очищая рабочую область) путем выполнения одного из следующих действий:

    На вкладке Home, в разделе Code, выбирают Clear Commands> Command Window, чтобы очистить буфер прокрутки Командного окна.

    Используйте функцию clc , чтобы очистить буфер прокрутки Командного окна.

    Используйте функцию home , чтобы очистить ваше текущее представление Командного окна, не очищая буфер прокрутки.


    Смотрите также

    Документация MATLAB
    Поддержка

    © 1994-2020 The MathWorks, Inc.

    1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.

    2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.

    3. Сохраняйте структуру оригинального текста — например, не разбивайте одно предложение на два.

    4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.

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

    Перенаправление ввода вывода Linux

    Одна из самых интересных и полезных тем для системных администраторов и новых пользователей, которые только начинают разбираться в работе с терминалом — это перенаправление потоков ввода вывода Linux. Эта особенность терминала позволяет перенаправлять вывод команд в файл, или содержимое файла на ввод команды, объединять команды вместе, и образовать конвейеры команд.

    В этой статье мы рассмотрим как выполняется перенаправление потоков ввода вывода в Linux, какие операторы для этого используются, а также где все это можно применять.

    Как работает перенаправление ввода вывода

    Все команды, которые мы выполняем, возвращают нам три вида данных:

    • Результат выполнения команды, обычно текстовые данные, которые запросил пользователь;
    • Сообщения об ошибках — информируют о процессе выполнения команды и возникших непредвиденных обстоятельствах;
    • Код возврата — число, которое позволяет оценить правильно ли отработала программа.

    В Linux все субстанции считаются файлами, в том числе и потоки ввода вывода linux — файлы. В каждом дистрибутиве есть три основных файла потоков, которые могут использовать программы, они определяются оболочкой и идентифицируются по номеру дескриптора файла:

    • STDIN или 0 — этот файл связан с клавиатурой и большинство команд получают данные для работы отсюда;
    • STDOUT или 1 — это стандартный вывод, сюда программа отправляет все результаты своей работы. Он связан с экраном, или если быть точным, то с терминалом, в котором выполняется программа;
    • STDERR или 2 — все сообщения об ошибках выводятся в этот файл.

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

    Перенаправить вывод в файл

    Все очень просто. Вы можете перенаправить вывод в файл с помощью символа >. Например, сохраним вывод команды top:

    top -bn 5 > top.log

    Опция -b заставляет программу работать в не интерактивном пакетном режиме, а n — повторяет операцию пять раз, чтобы получить информацию обо всех процессах. Теперь смотрим что получилось с помощью cat:

    Символ «>» перезаписывает информацию из файла, если там уже что-то есть. Для добавления данных в конец используйте «>>». Например, перенаправить вывод в файл linux еще для top:

    top -bn 5 >> top.log

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

    top -bn 5 1>top.log

    Перенаправить ошибки в файл

    Чтобы перенаправить вывод ошибок в файл вам нужно явно указать дескриптор файла, который собираетесь перенаправлять. Для ошибок — это номер 2. Например, при попытке получения доступа к каталогу суперпользователя ls выдаст ошибку:

    Вы можете перенаправить стандартный поток ошибок в файл так:

    ls -l /root/ 2> ls-error.log
    $ cat ls-error.log

    Чтобы добавить данные в конец файла используйте тот же символ:

    ls -l /root/ 2>>ls-error.log

    Перенаправить стандартный вывод и ошибки в файл

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

    ls -l /root/ >ls-error.log 2>&1

    Сначала будет отправлен вывод команды ls в файл ls-error.log c помощью первого символа перенаправления. Дальше в тот же самый файл будут направлены все ошибки. Второй метод проще:

    ls -l /root/ &> ls-error.log

    Также можно использовать добавление вместо перезаписи:

    ls -l /root/ &>> ls-error.log

    Стандартный ввод из файла

    Большинство программ, кроме сервисов, получают данные для своей работы через стандартный ввод. По умолчанию стандартный ввод ожидает данных от клавиатуры. Но вы можете заставить программу читать данные из файла с помощью оператора » cat

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

    Таким образом, мы в одной команде перенаправляем ввод вывод linux.

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

    Можно работать не только с файлами, но и перенаправлять вывод одной команды в качестве ввода другой. Это очень полезно для выполнения сложных операций. Например, выведем пять недавно измененных файлов:

    ls -lt | head -n 5

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

    echo test/ tmp/ | xargs -n 1 cp -v testfile.sh

    Здесь параметр -n 1 задает, что для одной команды нужно подставлять только один параметр, а опция -v в cp позволяет выводить подробную информацию о перемещениях. Еще одна, полезная в таких случаях команда — это tee. Она читает данные из стандартного ввода и записывает в стандартный вывод или файлы. Например:

    echo «Тест работы tee» | tee file1

    В сочетании с другими командами все это может использоваться для создания сложных инструкций из нескольких команд.

    Выводы

    В этой статье мы рассмотрели основы перенаправления потоков ввода вывода Linux. Теперь вы знаете как перенаправить вывод в файл linux или вывод из файла. Это очень просто и удобно. Если у вас остались вопросы, спрашивайте в комментариях!

    Илон Маск рекомендует:  Что такое код xml_set_default_handler
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL
    Формат цифрового дисплея Пример Вывод