8-900-374-94-44
[email protected]
Slide Image
Меню

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

Содержание

8.4. Форматированный ввод/вывод. в языке Си кратко…

Привет, сегодня поговорим про форматированный ввод/вывод в языке си, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое форматированный ввод/вывод в языке си , настоятельно рекомендую прочитать все из категории Алгоритмизация и программирование. Структурное программирование. Язык C.

Задачи ввода/вывода в языке Си решают функции printf() и scanf().
Операторы вывода используются для вывода значений переменных и текста.
Тексты в Си записываются в кавычках. В языке Си отсутствует специальный тип для работы со строками. Вместо этого строки представляются как массив типа char. Элементы строки, хранясь в массиве, записываются в смежные ячейки памяти. В конце строки ставится отметка \0. Наличие этой отметки говорит о том, что строка должна иметь размер на единицу больший, чем количество символов. Объявляется строка указанием типа char и записью размера в [].
Пример:

char name[40];
Для работы со строками к программе необходимо подключить файл string.h.
Каждая из функций ввода/вывода использует управляющую строку и список аргументов. Управляющая строка записывается первой и заключается в кавычки. Управляющие строки и аргументы не перемешиваются. Управляющие строки прежде всего содержат указание на вывод значения того или иного типа. Их называют спецификаторами преобразования.

Спецификаторы Действия
%a, %A возвращают число с плавающей точкой и 16-е цифры
%c возвращает одиночный символ
%d, %i возвращают целое число в десятичной форме
%e, %E возвращают число с плавающей точкой в экспоненциальной форме
%f возвращает число с плавающей точкой в десятичной форме
%g использует спецификатор %f или %e в зависимости от значения (выбирается автоматически)
%o возвращает восьмеричное целое число без знака
%p вывод указателя в шестнадцатеричном формате
%s возвращает строку символов
%u возвращает десятичное целое число без знака
%x, %X возвращают шестнадцатеричное целое число без знака
%% вывод на печать символа %


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

Модификаторы Действия
цифра/цифры минимальная ширина поля вывода (количество экранных символов)
.цифра точность
h используется при целочисленных преобразованиях для кодирования значений short int и unsigned short int
hh используется при целочисленных преобразованиях для кодирования значений signed char и unsigned char
j используется при целочисленных преобразованиях для получения типов int_max_t и uint_max_t
l используется при целочисленных преобразованиях для получения типа long int и unsigned long int
ll используется при целочисленных преобразованиях для получения типа long long int и unsigned long long int
t используется с целью кодирования значений типа ptroliff_t, который является разностью двух указателей
z используется с целью кодирования значений size_t
L используется при преобразовании чисел с плавающей точкой типа long double
флаг + значения со знаком печатаются со знаком «+» или «-«
флаг элемент выравнивается по левому краю
флаг пробел значение со знаком «+» печатается с пробелом, но без знака
флаг # для спецификаторов %o, %x, %X выводит не значащие нули .
Об этом говорит сайт https://intellect.icu . Для форм с плавающей точкой гарантировано печатается точка, даже если десятичных знаков нет
флаг 0 для числовых форм вместо пробелов на свободные экранные места выводятся нули


Ввод данных осуществляется с помощью функции scanf(). В языке Си существует несколько функций ввода. scanf() употребляется чаще других, т.к. ей присущ различный формат ввода. Также как и функция printf(), ввод использует управляющую строку, сопровождаемую списком аргументов. Управляющая строка указывает в какие форматы должен быть преобразован вводимый текст. В качестве параметров функция scanf() использует не сами переменные, а указатели на них. Для использования scanf()необходимо выполнять два правила:
1) если функция используется для считывания значений в переменную основного типа, то перед именем переменной ставится знак &.

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

Спецификаторы Действия
%c интерпретирует результат ввода в качестве символа
%d интерпретирует результат ввода как десятичное целое число со знаком
%e, %f, %g, %a интерпретирует результат ввода как число с плавающей точкой
%E, %F, %G, %A интерпретирует результат ввода как число с плавающей точкой. Все вводимые символы преобразуются в заглавные
%o интерпретирует результат ввода как восьмеричное целое число со знаком
интерпретирует результат ввода как указатель
%s интерпретирует результат ввода как строку. Ввод начинается с первого символа, не являющегося служебным и включает все символы до следующего служебного
%u интерпретирует результат ввода как целое число без знака
%x, %X интерпретирует результат ввода как шестнадцатеричное целое число со знаком


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

Модификаторы Действия
* подавить присваивание
цифра/цифры максимальная ширина поля ввода. Ввод прекращается когда указанная ширина достигнута или при обнаружении служебного символа
hh определяет считывание целого числа в виде signed char или unsigned char
ll определяет считывание целого числа в виде long long или unsigned long long
L, l, h определяет считывание числа в виде short int, unsigned short int, unsigned long, long, double или long double


Напиши свое отношение про форматированный ввод/вывод в языке си.

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

Текстовый ввод-вывод — тест 7

Главная / Программирование / Текстовый ввод-вывод / Тест 7

Упражнение 1:


Номер 1

Какими функциями языка Си осуществляется вывод строки символов в стандартный поток вывода?

Ответ:

&nbsp(1) cprintf&nbsp

&nbsp(2) printf&nbsp

&nbsp(3) sprintf&nbsp

&nbsp(4) cputs&nbsp

&nbsp(5) puts&nbsp

&nbsp(6) putch&nbsp

&nbsp(7)

putc&nbsp



Номер 2

Какими функциями языка Си осуществляется вывод одиночного символа в стандартный поток вывода?

Ответ:

&nbsp(1) cprintf&nbsp

&nbsp(2) printf&nbsp

&nbsp(3) sprintf&nbsp

&nbsp(4) cputs&nbsp

&nbsp(5) puts&nbsp

&nbsp(6) putch&nbsp

&nbsp(7) putc&nbsp



Номер 3

Какими функциями языка Си осуществляется форматированный ввод-вывод в стандартный поток вывода?

Ответ:

&nbsp(1) cprintf&nbsp

&nbsp(2) printf&nbsp

&nbsp(3) sprintf&nbsp

&nbsp(4) cputs&nbsp

&nbsp(5) puts&nbsp

&nbsp(6) putch&nbsp

&nbsp(7) putc&nbsp



Упражнение 2:


Номер 1

Каким именем обозначается дескриптор стандартного потока вывода в языке Си?

Ответ:

&nbsp(1) cerr&nbsp

&nbsp(2) cin&nbsp

&nbsp(3) cout&nbsp

&nbsp(4) stderr&nbsp

&nbsp(5) stdin&nbsp

&nbsp(6) stdout&nbsp



Номер 2

Каким именем обозначается дескриптор стандартного потока вывода в языке Си?

Ответ:

&nbsp(1) cerr&nbsp

&nbsp(2) cin&nbsp

&nbsp(3) cout&nbsp

&nbsp(4) stderr&nbsp

&nbsp(5) stdin&nbsp

&nbsp(6) stdout&nbsp



Номер 3

Какими операторами и функциями осуществляется вывод символов в стандартный поток вывода средствами языка C++?

Ответ:

&nbsp(1) «<<«&nbsp

&nbsp(2) «>>»&nbsp

&nbsp(3) cin. get&nbsp

&nbsp(4) cout.put&nbsp

&nbsp(5) cout.right&nbsp

&nbsp(6) cin.ignore&nbsp



Упражнение 3:


Номер 1

Какими функциями и операторами осуществляется вывод текста в стандартный поток вывода на языке Quick Basic?

Ответ:

&nbsp(1) PRINT&nbsp

&nbsp(2) PRINT USING&nbsp

&nbsp(3) LPRINT&nbsp



Номер 2

Какими функциями и операторами осуществляется форматированный вывод текста в стандартный поток вывода на языке Quick Basic?

Ответ:

&nbsp(1) PRINT&nbsp

&nbsp(2) PRINT USING&nbsp

&nbsp(3) LPRINT&nbsp



Номер 3

Какова длина "зоны вывода" на языке Quick Basic?

Ответ:

&nbsp(1) один символ&nbsp

&nbsp(2) восемь символов&nbsp

&nbsp(3) четырнадцать символов&nbsp

&nbsp(4) шестнадцать символов&nbsp

&nbsp(5) ширина экрана&nbsp



Упражнение 4:


Номер 1

Каким символом должен заканчиваться оператор PRINT на языке Quick Basic, чтобы вывод продолжился с позиции предыдущего вывода?

Ответ:

&nbsp(1) «пусто» (нет символа)&nbsp

&nbsp(2) символом «,» (запятая)&nbsp

&nbsp(3) символом «;» (точка с запятой)&nbsp

&nbsp(4) символом процент «%»&nbsp



Номер 2

Каким символом должен заканчиваться оператор print на языке Python, чтобы вывод продолжился с позиции предыдущего вывода?

Ответ:

&nbsp(1) «пусто» (нет символа)&nbsp

&nbsp(2) символом «,» (запятая)&nbsp

&nbsp(3) символом «;» (точка с запятой)&nbsp

&nbsp(4) символом процент «%»&nbsp



Номер 3

Каким символом должен заканчиваться оператор print на языке Perl, чтобы вывод продолжился с позиции предыдущего вывода?

Ответ:

&nbsp(1) «пусто» (нет символа)&nbsp

&nbsp(2) символом «,» (запятая)&nbsp

&nbsp(3) символом «;» (точка с запятой)&nbsp

&nbsp(4) символом процент «%»&nbsp



Упражнение 5:


Номер 1

Какие операторы используются при выводе символов в стандартный поток вывода на языке Perl?

Ответ:

&nbsp(1) die&nbsp

&nbsp(2) get&nbsp

&nbsp(3) "<>" (ромб)&nbsp

&nbsp(4) print&nbsp

&nbsp(5) printf&nbsp

&nbsp(6) write&nbsp



Номер 2

Какие функции языка Prolog используются для форматированного вывода строки символов?

Ответ:

&nbsp(1) write&nbsp

&nbsp(2) writef&nbsp

&nbsp(3) nl&nbsp

&nbsp(4) scr_char&nbsp



Номер 3

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

Ответ:

&nbsp(1) WScript. StdOut.Write&nbsp

&nbsp(2) WScript.StdOut.WriteBlankLines&nbsp

&nbsp(3) WScript.StdOut.WriteLine&nbsp

&nbsp(4) WScript.Echo&nbsp



Главная / Программирование / Текстовый ввод-вывод / Тест 7

Встроенная ОС, поддержка и услуги | ОСРВ, гипервизор

Облачное программное обеспечение

Узнать больше

Запускайте критически важные встраиваемые системы быстрее с помощью нашей коммерческой ОСРВ, гипервизора, средств разработки и услуг.

БЕСПЛАТНАЯ 30-ДНЕВНАЯ ПРОБНАЯ ВЕРСИЯ ПОГОВОРИ С НАМИ

Встроенным системам доверяют везде

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

Нам доверяют OEM-производители и компании первого уровня по всему миру, и сейчас мы работаем с более чем 215 миллионами автомобилей.

Мы создаем надежное и безопасное встроенное системное программное обеспечение с 19 лет.80.

ПОСМОТРЕТЬ ПОРТФОЛИО НАШЕЙ ПРОДУКЦИИ

Все, что вам нужно для создания лучших встраиваемых систем

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

  • Программное обеспечение
  • Поддерживать
  • Профессиональные услуги

Программное обеспечение

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

 Мы предлагаем:

  • Продукты Foundation , включая QNX ® Neutrino ® RTOS, QNX ® Software Development Platform (POS) и совместимую с QNX платформу разработки программного обеспечения (SDP) со средой разработки и разработки 58 ® Гипервизор
  • Сертифицированы по безопасности Варианты нашей продукции, ускоряющие процесс сертификации
  • Решения для обеспечения безопасности , включая безопасные беспроводные обновления и BlackBerry® Jarvis®, наше уникальное решение для анализа двоичных файлов
  • ПО промежуточного слоя для ускорения разработки и ускорения выхода на рынок

Узнать больше

Поддержка

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

Мы предлагаем:

  • Различные пакеты поддержки и технические консультации от разработчиков, инженеров и архитекторов
  • Лучший в своем классе продукт Документация, дополненная нашей базой знаний
  • Пакеты поддержки плат для широкого спектра процессоров ARM и x86

Варианты поддержки

Профессиональные услуги

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

Мы предлагаем:

  • Услуги безопасности и решения для анализа двоичного кода
  • Индивидуальная разработка
  • Услуги по обеспечению безопасности , которые помогут вам получить сертификаты IEC 61508, ISO 26262, IEC 62304 и EN 5012X
  • Учебные курсы , разработанные и проводимые экспертами в области функциональной безопасности и разработки встроенного программного обеспечения

Узнать больше

  • Программное обеспечение

    Программное обеспечение

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

     Мы предлагаем:

    • продукты Foundation , включая QNX ® Neutrino ® RTOS, среду QNX ® и платформу разработки программного обеспечения (SDP) QNX ® с POSIX и POSIX.0058® Гипервизор
    • Сертифицированы по безопасности Варианты нашей продукции, ускоряющие процесс сертификации
    • Решения для обеспечения безопасности , включая безопасные беспроводные обновления и BlackBerry® Jarvis®, наше уникальное решение для анализа двоичных файлов
    • ПО промежуточного слоя для ускорения разработки и ускорения выхода на рынок

    Узнать больше

  • Поддержка

    Поддержка

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

    Мы предлагаем:

    • Различные пакеты поддержки и технические консультации от разработчиков, инженеров и архитекторов
    • Лучший в своем классе продукт Документация, дополненная нашей базой знаний
    • Пакеты поддержки плат для широкого спектра процессоров ARM и x86

    Варианты поддержки

  • Профессиональные услуги

    Профессиональные услуги

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

    Мы предлагаем:

    • Услуги безопасности и решения для анализа двоичного кода
    • Индивидуальная разработка
    • Услуги по обеспечению безопасности , которые помогут вам получить сертификаты IEC 61508, ISO 26262, IEC 62304 и EN 5012X
    • Учебные курсы , разработанные и проводимые экспертами в области функциональной безопасности и разработки встроенного программного обеспечения

    Узнать больше

Зачем выбирать BlackBerry QNX Services

Безопасность

Ускорьте вывод на рынок программного обеспечения, предварительно сертифицированного по IEC 61508, ISO 26262 и IEC 62304, обучения QNX® по функциональной безопасности и услуг по обеспечению безопасности.

Безопасность

Благодаря микроядерной архитектуре наша ОСРВ и гипервизор защищены по своей конструкции. Положитесь на наших проверенных экспертов по кибербезопасности, которые помогут защитить ваши системы.

Масштабируемость

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

Надежность

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

Где мы помогаем

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

Подключенные и автономные транспортные средства

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

Узнать больше

Робототехника и автоматизация

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

Узнать больше

Операционная система для медицинских устройств

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

Узнать больше

Операционная система реального времени для железнодорожных систем

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

Узнать больше

Операционная система для тяжелого машиностроения

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

Узнать больше

ОС реального времени для промышленных систем управления

Решите уникальные проблемы безопасности, защиты и производительности, которые могут возникнуть при разработке систем Industrial IoT (IIoT).

Узнать больше

Встроенная ОС для аэрокосмической и оборонной промышленности

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

Узнать больше

Программное обеспечение для коммерческого транспорта

Упростите сертификацию безопасности по ISO 26262, обеспечьте доступность и укрепите безопасность с помощью программных решений, поддерживающих адаптивную платформу AUTOSAR.

Узнать больше

Узнать больше

Ресурсы

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

Посетите ресурсный центр

Сертификаты

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

Узнать больше

Служба поддержки

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

Посетите службу поддержки

BSP

Поиск в нашей библиотеке пакетов поддержки плат (BSP) по поставщику микросхем, названию платы или названию BSP.

Найдите свой BSP

Предстоящие События
  • Предстоящие события
  • Embedded World в Нюрнберге — 14–16 марта
  • India TECHFORUM в Бангалоре — 29 марта
  • Зарегистрируйтесь на мероприятие или зарегистрируйтесь и присоединяйтесь к нам на вебинаре.

|

БЮЛЛЕТЕНЬ НОВОСТЕЙ

Мероприятие, встроенные системы

Embedded World в Нюрнберге — 14–16 марта

Зарегистрироваться

Мероприятие, встроенные системы

Индия TECHFORUM в Бангалоре — 29 марта

Зарегистрироваться

Мероприятия и вебинары BlackBerry QNX

Зарегистрируйтесь для участия в мероприятии или зарегистрируйтесь и присоединяйтесь к нам для участия в вебинаре.

См. Расписание

Использование явно отформатированного ввода/вывода

Ключевое слово FORMAT может использоваться с процедурами форматированного ввода/вывода для указания внешнего вида данных. IDL поддерживает два разных синтаксиса для строк формата: стиль FORTRAN и стиль C printf.

Примечание. IDL использует для форматирования стандартную функцию ввода-вывода snprintf. Различные операционные системы реализуют эту функцию по-разному, что может привести к небольшим несоответствиям во внешнем виде вывода.

Пример


Используйте стиль FORTRAN для вывода трех чисел, заключенных в квадратные скобки:

 PRINT, FINDGEN(3), FORMAT = '("Значения: [", 3(" ",f0), "] ")' 

Теперь, используя стиль C printf:

 PRINT, FINDGEN(3), FORMAT = 'Значения: [ %f %f %f]' 

В обоих случаях IDL печатает:

 Значения: [ 0,000000 1,000000 2,000000] 

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

Дополнительные примеры см. внизу.

Строки формата FORTRAN


Синтаксис


Строки формата FORTRAN имеют следующий вид:

 FORMAT = '(q 9где 2 f  и  s  описаны ниже . 

Строка формата в стиле FORTRAN должна начинаться и заканчиваться круглыми скобками.

Ограничители записи

q — это ноль или более косых черт (/) ограничителей записи. При выводе каждый признак конца записи приводит к перемещению вывода на новую строку. При вводе каждый признак конца записи приводит к чтению следующей строки ввода.

Коды формата

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

 ...n(q  1  f  1  s  1  f  2 7  6 9 9 ... f  n  q  n  )... 

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

 FORMAT = '("Результат: ", "<",I5,">", "<",I5,">")' 

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

 FORMAT = '( "Результат: ", 2("<",I5,">"))' 

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

Список доступных кодов форматов см. в разделе Коды форматов в стиле FORTRAN.

Разделители полей

s — разделитель полей. Разделитель полей состоит из одной или нескольких запятых (,) и/или косой черты (/). Единственное ограничение состоит в том, что две запятые не могут стоять рядом.

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

Правила обработки строк формата FORTRAN

IDL использует следующие правила для обработки строк формата FORTRAN: данные остаются в списке аргументов. Разделитель полей запятая не служит никакой цели, кроме как разграничить коды формата.

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

  • Когда встречается код формата, который передает данные в список аргументов или из него, он сопоставляется со следующим данным в списке аргументов.

    1. При вводе прочитать данные из файла и отформатировать их в соответствии с кодом формата. Если тип данных входных данных не согласуется с типом данных входной переменной, выполните преобразование типов, чтобы соответствовать переменной, если это возможно; в противном случае выдайте ошибку преобразования типа и остановитесь.
    2. На выходе запишите данные в соответствии с кодом формата. Если тип данных не соответствует коду формата, по возможности выполните преобразование типа до вывода. Если преобразование типов невозможно, выдайте ошибку преобразования типов и остановитесь.
  • Если достигнута последняя закрывающая скобка строки формата и в списке аргументов не осталось данных, завершить работу. Однако если в списке аргументов все еще есть данные для обработки, то часть или вся спецификация формата используется повторно. Этот процесс называется реверс формата .
  • Реверсия формата

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

     PRINT, FORMAT = '("Значения: ", 2("<", I1, ">"))', $ 
        INDGEN(6) 

    результаты на выходе

     Значения: < 0><1> 
     <2><3> 
     <4><5> 

    Процесс создания этого вывода выглядит следующим образом:

    1. Выведите строку «Значения: ».
    2. Обработайте спецификацию группы и выведите первые два значения. Обнаружен конец спецификации формата, поэтому завершайте выходную запись. Данные остались, поэтому вернитесь к спецификации группы 2("<", I1, ">").
    3. Повторяйте шаг 2, пока не закончатся данные.
    4. Конец выходной записи.

    Строки формата в стиле C printf


    Синтаксис


    Строки формата в стиле C printf имеют следующий вид:

     FORMAT = 'Some text %f more text %f etc' 
     

    2 код формата, описанный ниже.

    Примечание: IDL различает два разных формата (FORTRAN или C printf) тем, начинается ли строка формата со скобки или нет. Если круглых скобок нет, IDL предполагает, что это формат в стиле C printf.

    Совет: Если вам нужна скобка в начале строки формата в стиле C printf, вы должны экранировать скобку с помощью символа обратной косой черты (\).

    Коды форматов

    Список доступных кодов форматов см. в разделе Коды форматов C printf-Style.

    Правила обработки строк формата в стиле C printf

    IDL использует следующие правила для обработки строк формата в стиле C printf: остается в списке аргументов.

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

  • Когда встречается код формата, который передает данные в список аргументов или из него, он сопоставляется со следующим данным в списке аргументов.

    1. При вводе прочитать данные из файла и отформатировать их в соответствии с кодом формата. Если тип данных входных данных не согласуется с типом данных входной переменной, выполните преобразование типов, чтобы соответствовать переменной, если это возможно; в противном случае выдайте ошибку преобразования типа и остановитесь.
    2. На выходе запишите данные в соответствии с кодом формата. Если тип данных не соответствует коду формата, по возможности выполните преобразование типа до вывода. Если преобразование типов невозможно, выдайте ошибку преобразования типов и остановитесь.
  • Примеры


    Чтение форматированных табличных данных


    Явно отформатированный ввод/вывод IDL обладает мощностью и гибкостью для обработки практически любых форматированных данных. Обычное использование явно отформатированного ввода/вывода включает в себя чтение и запись таблиц данных. Рассмотрим файл данных, содержащий записи данных о сотрудниках. У каждого сотрудника есть имя (строка, 32 столбца) и количество лет работы (целое число, 3 столбца) в первой строке. Следующие две строки содержат месячную зарплату каждого сотрудника за последние двенадцать месяцев. Образец файла с именем employee.dat в этом формате может выглядеть следующим образом:

     Bullwinkle 10 
     1000.0 9000.97 1100.0 2000.0 
     5000.0 3000.0 1000.90 3500.0 9000.0 
     Борис 11 
     400,0 500,0 1300,10 350,0 745,0 3000,0 
     200,0 100,0 100,0 50,0 60,0 0,25 
     Наташа 10 
     950. 0 1050.0 1350.0 410.0 797.0 200.36 
     2600.0 2000.0 1500.0 2000.0 1000.0 400.0 
     Скалистый 11 900.0 1100.0 0.0 0.0 2000.37 
     5000.0 3000.0 1000.01 3500.0 6000.0 900.12 

    Следующие операторы IDL считывают данные в вышеуказанном формате и производят сводка содержимого файла:

     ;Открыть файл данных для ввода. 
     OPENR, 1, 'employee.dat' 
       
     ;создайте переменные для хранения имени, количества лет и месячного 
     ;зарплаты. 
     имя = '' & годы = 0 & зарплата = FLTARR(12) 
       
     ;вывести заголовок сводки. 
     PRINT, FORMAT='("Имя", 28X, "Годы", 4X, "Годовая зарплата")' 
       
     ;Примечание. Фактическая пунктирная линия длиннее, чем показано здесь. 
     PRINT, '========' 
       
     ;Перебрать каждого сотрудника. 
     WHILE (~ EOF(1)) DO BEGIN 
       
        ;Прочитайте данные о следующем сотруднике.  
        READF, 1, $ 
        FORMAT = '(A32,I3,2(/,6F10.2))', имя, годы, зарплата 
       
     ;Вывести информацию о сотруднике. Используйте ИТОГО, чтобы просуммировать месячные 
     ;зарплаты, чтобы получить годовую зарплату. 
        ПЕЧАТЬ, ФОРМАТ='(A32,I5,5X,F10.2)', имя, годы, ИТОГО(зарплата) 
       
     ENDWHILE 
       
     ЗАКРЫТЬ, 1 

    Результат выполнения этих операторов для employee.dat выглядит следующим образом:

     Имя                        Годы    Годовая зарплата 
     ========================= =================================== 
     Буллвинкль                                           10        32501.09 
     Борис                                                                            94 
     Наташа                        10       14257,36 
     Рокки                           11       32500,50 

    Чтение записей с несколькими элементами массива


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

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

    FORTRAN Write:

     DIMENSION ALT(100),PRES(100),TEMP(100),VELO(100) 
     OPEN (UNIT = 1, STATUS='NEW', FILE='TEST') 
     WRITE (1,'(4(1x,g15. 5))') 
          (ALT(I),PRES(I),TEMP(I),VELO(I),I=1,100) 

    IDL Read:

     ;Открыть файл для ввода. 
     OPENR, 1, 'тест' 
       
     ;Определить переменную (NVARS by NOBS). 
     A = FLTARR(4,100) 
       
     ;Прочитайте данные. 
     READF, 1, А 
       
     ;Транспонировать так, чтобы столбцы стали строками. 
     A = ТРАНСП(A) 
       
     ;Извлечь переменные. 
     ALT = A[*, 0] 
     PRES = A[*, 1] 
     TEMP = A[*, 2] 
     VELO = A[*, 3] 

    Обратите внимание, что этот же пример можно записать без подразумеваемого списка DO, записывая все элементы для каждой переменной последовательно и значительно упрощая:

    FORTRAN Write:

     DIMENSION ALT(100),PRES(100),TEMP(100),VELO(100) 
     ОТКРЫТ (БЛОК = 1, СОСТОЯНИЕ = 'НОВЫЙ', ФАЙЛ = 'ТЕСТ') 
     ЗАПИСЬ (1,'(4(1x,G15.5))') ALT,PRES,TEMP,VELO 

    IDL Чтение :

     ;Определить переменные.  
     ALT = FLTARR(100) 
     PRES = ALT & TEMP = ALT & VELO = ALT 
     OPENR, 1, 'тест' 
     READF, 1, ALT, PRES, TEMP, VELO 

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

    FORTRAN Запись:

     РАЗМЕР ALT(100),PRES(100),TEMP(100),VELO(100) 
     CHARACTER * 10 OBS(100) 
     OPEN (UNIT = 1, STATUS = 'NEW', ФАЙЛ = 'ТЕСТ') 
     ЗАПИСЬ (1,'(4(1X,G15.5),2X,A)') 
       (ALT(I),PRES(I),TEMP(I),VELO(I ),OBS(I),I=1,100) 

    Чтение IDL:

     ;Доступ к файлу.  Чтение файлов, содержащих от 1 до 200 записей. 
     OPENR, 1, 'test' 
       
     ;Определите вектор, сделайте его достаточно большим для самого большого случая. 
     ALT = FLTARR(200) 
       
     ;Определить другие векторы, используя первый. 
     PRES = ALT & TEMP = ALT & VELO = ALT 
       
     ;Определить массив строк. 
     OBS = STRARR(200) 
       
     ;Определить скалярную строку. 
     OBSS = '' 
       
     ;Инициализировать счетчик. 
     I = 0 
       
     WHILE ~ EOF(1) DO BEGIN 
        ;Чтение скаляров. 
        READF, 1, $ 
       
        FORMAT = '(4(1X, G15.5), 2X, A10)', $ 
          ALTS, PRESS, TEMPS, VELOS, OBSS 
       
     ;Сохранить в каждом векторе. 
        ALT[I] = ALTS & PRES[I] = PRESS & TEMP[I] = TEMPS 
        VELO[I] = VELOS & OBS[I] = OBSS 
       
        ;Увеличьте счетчик и проверьте наличие слишком большого количества записей .  
        ЕСЛИ I LT 199 THEN I = I + 1 ELSE STOP, 'Слишком много записей' 
     ENDWHILE 

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

     ALT = ALT[0:I-1] 

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

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

     FOR I = 0, 99 DO READF, 1, ALT[I], PRES[I], TEMP[I], VELO[I] 

    Это утверждение неверно . Элементы с индексами (включая диапазоны) — это временные выражения, которые передаются в качестве значений процедурам и функциям (в данном примере — READF).

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *