Привет, сегодня поговорим про форматированный ввод/вывод в языке си, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое форматированный ввод/вывод в языке си , настоятельно рекомендую прочитать все из категории Алгоритмизация и программирование. Структурное программирование. Язык C.
Задачи ввода/вывода в языке Си решают функции printf() и scanf().
Операторы вывода используются для вывода значений переменных и текста.
Тексты в Си записываются в кавычках. В языке Си отсутствует специальный тип для работы со строками. Вместо этого строки представляются как массив типа char. Элементы строки, хранясь в массиве, записываются в смежные ячейки памяти. В конце строки ставится отметка \0. Наличие этой отметки говорит о том, что строка должна иметь размер на единицу больший, чем количество символов. Объявляется строка указанием типа char и записью размера в [].
Пример:
Спецификаторы | Действия |
%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 выводит не значащие нули . |
флаг | 0 | для числовых форм вместо пробелов на свободные экранные места выводятся нули |
Ввод данных осуществляется с помощью функции scanf(). В языке Си существует несколько функций ввода. scanf() употребляется чаще других, т.к. ей присущ различный формат ввода. Также как и функция printf(), ввод использует управляющую строку, сопровождаемую списком аргументов. Управляющая строка указывает в какие форматы должен быть преобразован вводимый текст. В качестве параметров функция scanf() использует не сами переменные, а указатели на них. Для использования scanf()необходимо выполнять два правила:
1) если функция используется для считывания значений в переменную основного типа, то перед именем переменной ставится знак &.
Спецификаторы | Действия |
%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 |
Напиши свое отношение про форматированный ввод/вывод в языке си.
Главная / Программирование / Текстовый ввод-вывод / Тест 7
Упражнение 1:
Номер 1
Какими функциями языка Си осуществляется вывод строки символов в стандартный поток вывода?
Ответ:
 (1) cprintf
 
 (2) printf
 
 (3) sprintf
 
 (4) cputs
 
 (5) puts
 
 (6) putch
 
 (7)
putc
 Номер 2
Какими функциями языка Си осуществляется вывод одиночного символа в стандартный поток вывода?
Ответ:
 (1) cprintf
 
 (2) printf
 
 (3) sprintf
 
 (4) cputs
 
 (5) puts
 
 (6) putch
 
 (7) putc
 
Номер 3
Какими функциями языка Си осуществляется форматированный ввод-вывод в стандартный поток вывода?
Ответ:
 (1) cprintf
 
 (2) printf
 
 (3) sprintf
 
 (4) cputs
 
 (5) puts
 
 (6) putch
 
 (7) putc
 
Упражнение 2:
Номер 1
Каким именем обозначается дескриптор стандартного потока вывода в языке Си?
Ответ:
 (1) cerr
 
 (2) cin
 
 (3) cout
 
 (4) stderr
 
 (5) stdin
 
 (6) stdout
 
Номер 2
Каким именем обозначается дескриптор стандартного потока вывода в языке Си?
Ответ:
 (1) cerr
 
 (2) cin
 
 (3) cout
 
 (4) stderr
 
 (5) stdin
 
 (6) stdout
 
Номер 3
Какими операторами и функциями осуществляется вывод символов в стандартный поток вывода средствами языка C++?
Ответ:
 (1) «<<« 
 (2) «>>» 
 (3) cin. get 
 (4) cout.put 
 (5) cout.right 
 (6) cin.ignore 
Упражнение 3:
Номер 1
Какими функциями и операторами осуществляется вывод текста в стандартный поток вывода на языке Quick Basic?
Ответ:
 (1) PRINT
 
 (2) PRINT USING
 
 (3) LPRINT
 
Номер 2
Какими функциями и операторами осуществляется форматированный вывод текста в стандартный поток вывода на языке Quick Basic?
Ответ:
 (1) PRINT
 
 (2) PRINT USING
 
 (3) LPRINT
 
Номер 3
Какова длина "зоны вывода" на языке Quick Basic?
Ответ:
 (1) один символ 
 (2) восемь символов 
 (3) четырнадцать символов 
 (4) шестнадцать символов 
 (5) ширина экрана 
Упражнение 4:
Номер 1
Каким символом должен заканчиваться оператор PRINT
на языке Quick Basic, чтобы вывод продолжился с позиции предыдущего вывода?
Ответ:
 (1) «пусто» (нет символа) 
 (2) символом «,» (запятая) 
 (3) символом «;» (точка с запятой) 
 (4) символом процент «%» 
Номер 2
Каким символом должен заканчиваться оператор print
на языке Python, чтобы вывод продолжился с позиции предыдущего вывода?
Ответ:
 (1) «пусто» (нет символа) 
 (2) символом «,» (запятая) 
 (3) символом «;» (точка с запятой) 
 (4) символом процент «%» 
Номер 3
Каким символом должен заканчиваться оператор print
на языке Perl, чтобы вывод продолжился с позиции предыдущего вывода?
Ответ:
 (1) «пусто» (нет символа) 
 (2) символом «,» (запятая) 
 (3) символом «;» (точка с запятой) 
 (4) символом процент «%» 
Упражнение 5:
Номер 1
Какие операторы используются при выводе символов в стандартный поток вывода на языке Perl?
Ответ:
 (1) die
 
 (2) get
 
 (3) "<>" (ромб)
 
 (4) print
 
 (5) printf
 
 (6) write
 
Номер 2
Какие функции языка Prolog используются для форматированного вывода строки символов?
Ответ:
 (1) write
 
 (2) writef
 
 (3) nl
 
 (4) scr_char
 
Номер 3
Какую функцию языка VBScript необходимо использовать, чтобы следующий вывод в поток осуществлялся с последней позицией вывода?
Ответ:
 (1) WScript. StdOut.Write
 
 (2) WScript.StdOut.WriteBlankLines
 
 (3) WScript.StdOut.WriteLine
 
 (4) WScript.Echo
 
Главная / Программирование / Текстовый ввод-вывод / Тест 7
Облачное программное обеспечение
Узнать больше
БЕСПЛАТНАЯ 30-ДНЕВНАЯ ПРОБНАЯ ВЕРСИЯ ПОГОВОРИ С НАМИ
Наша операционная система реального времени (RTOS), гипервизор и промежуточное ПО обеспечивают производительность и безопасность, а также упрощают сертификацию безопасности. Мы являемся предпочтительной встроенной ОС для транспортных средств, вентиляторов, систем управления поездами, систем автоматизации производства, медицинских роботов и многого другого.
Нам доверяют OEM-производители и компании первого уровня по всему миру, и сейчас мы работаем с более чем 215 миллионами автомобилей.
Мы создаем надежное и безопасное встроенное системное программное обеспечение с 19 лет.80.
ПОСМОТРЕТЬ ПОРТФОЛИО НАШЕЙ ПРОДУКЦИИ
Если вы хотите повысить уровень безопасности или упростить процесс кроссплатформенной разработки, мы можем помочь. Мы можем воплотить ваши планы в жизнь с помощью RTOS и гипервизора , специально созданного для встраиваемых систем, включая предварительно сертифицированные варианты продукта. Наша модульная микроядерная архитектура обеспечивает безопасность и надежность и позволяет избежать дублирования усилий по разработке ОС для нескольких продуктов. Мы предоставляем поддерживает на каждом этапе жизненного цикла продукта и предлагает профессиональные услуги и обучение , чтобы предоставить вам дополнительные знания, которые вам нужны, когда они вам нужны.
Встроенные системы стали более программно управляемыми и сложными, чем когда-либо. Позвольте нам предоставить программную основу и строительные блоки, чтобы помочь вам сосредоточиться на предоставлении дополнительных функций и программного обеспечения, а не на обслуживании ОС.
Мы предлагаем:
Узнать больше
Для успеха вам нужно больше, чем программное обеспечение. Вам нужен партнер, который знает, что работа не сделана, пока вы не приступите к работе.
Мы предлагаем:
Варианты поддержки
Если вам нужно расширить свою команду, запустить проект или сертифицировать свои продукты, вы можете положиться на наших экспертов по встраиваемым системам и ОС, которые предоставят необходимые вам знания и опыт.
Мы предлагаем:
Узнать больше
Программное обеспечение
Встроенные системы как никогда сложны и программно управляемы. Позвольте нам предоставить программную основу и строительные блоки, чтобы помочь вам сосредоточиться на предоставлении дополнительных функций и программного обеспечения, а не на обслуживании ОС.
Мы предлагаем:
Узнать больше
Поддержка
Для успеха вам нужно больше, чем программное обеспечение. Вам нужен партнер, который знает, что работа не сделана, пока вы не приступите к работе.
Мы предлагаем:
Варианты поддержки
Профессиональные услуги
Если вам нужно расширить свою команду, запустить проект или сертифицировать свои продукты, вы можете положиться на наших экспертов по встраиваемым системам и ОС, которые предоставят вам необходимые знания и опыт.
Мы предлагаем:
Узнать больше
Ускорьте вывод на рынок программного обеспечения, предварительно сертифицированного по 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 марта
Зарегистрироваться
Мероприятие, встроенные системыИндия 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 имеют следующий вид:
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: данные остаются в списке аргументов. Разделитель полей запятая не служит никакой цели, кроме как разграничить коды формата.
При обнаружении кода формата, который выполняет передачу данных , а не , обработайте его в соответствии с его значением.
Когда встречается код формата, который передает данные в список аргументов или из него, он сопоставляется со следующим данным в списке аргументов.
При реверсии формата текущая запись завершается, инициируется новая, а управление форматом возвращается к спецификации группового повторения, открывающая скобка которой совпадает с предпоследней закрывающей скобкой строки формата. Если формат не содержит спецификацию группового повтора, управление форматом возвращается к исходной открывающей скобке строки формата. Например, IDL-команда:
PRINT, FORMAT = '("Значения: ", 2("<", I1, ">"))', $
INDGEN(6)
результаты на выходе
Значения: < 0><1>
<2><3>
<4><5>
Процесс создания этого вывода выглядит следующим образом:
Строки формата в стиле 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: остается в списке аргументов.
Обработка любых встречающихся обычных символов. Для вывода распечатайте символы.
Когда встречается код формата, который передает данные в список аргументов или из него, он сопоставляется со следующим данным в списке аргументов.
Явно отформатированный ввод/вывод 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Борис 11400,0 500,0 1300,10 350,0 745,0 3000,0200,0 100,0 100,0 50,0 60,0 0,25Наташа 10950. 0 1050.0 1350.0 410.0 797.0 200.362600.0 2000.0 1500.0 2000.0 1000.0 400.0Скалистый 11 900.0 1100.0 0.0 0.0 2000.375000.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,VELOIDL Чтение :
;Определить переменные.ALT = FLTARR(100)PRES = ALT & TEMP = ALT & VELO = ALTOPENR, 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 = 0WHILE ~ 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] = TEMPSVELO[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).