dt=Text Лекция 06 0 Буферизированный (потоковый) ввод-вывод Содержание 06.00. Аннотация. 06.01. Стандартные потоки в операционных системах 06.02. Ввод со стандартного потока ввода 06.03. Резюме стандартного буферизированного ввода-вывода 06.04. Вопросы и упражнения. 06.05. Г Л О С С А Р И Й 06.06. Приложение №1 06.07. Приложение №2 06.08. Приложение №3 06.09. Приложение №4 5P9i0s8y19Z dt=Text 06.00. Аннотация. 1 На этой лекции Вы познакомитесь с «потоковым» вводом-выводом данных, и подробно рассмотрите операцию потокового ввода с клавиатуры. 5P9i0s8y19Z dt=Text 06.01. Стандартные потоки в операционных системах 1 В операционных системах корпорации Microsoft (начиная с версии MS-DOS 2.0) и всех «клонах» UNIX существует возможность «потокового ввода-вывода» данных, например, на консоль, на принтер или в файл. Принцип «потокового ввода-вывода» следующий: 1. В оперативной памяти средствами операционной системы создаётся некоторый «промежуточный буфер» для хранения данных, читаемых из файла, устройства или записывания на него этих данных; 2. Средствами программы, созданной прикладным программистом, происходит чтение или запись информации (символов) в этот буфер; 3. Средствами операционной системы осуществляется «синхронизация» этого буфера («потока данных») с файлом или устройством; 4. При создании или открытии файла для него выделяется буфер в оперативной памяти компьютера, а после закрытия файла этот буфер очищается. В буфер заносятся только символьные данные. Как следствие, при потоковом выводе нельзя (или «практически нельзя») изменить атрибуты выводимых символов, их шрифтовое и абзацное оформление и т.д. Кроме того, в стандартные потоки ввода-вывода нельзя выводить «двоичные» файлы (то есть файлы, имеющую кодировку, отличную от ASCII и совместимой с ней кодировки). В операционных системах корпорации Microsoft при потоковом вводе-выводе для вывода на консоль кириллических символов возможна только кодировка OEM 866 (кодовая страница MS-DOS для русскоязычных пользователей). Это в настоящее время резко ограничивает применение потокового ввода-вывода для создания программ в современном программировании. Однако этот подход широко востребован в UNIX и её клонах, работающих в режиме командной строки. Вследствие вышесказанного автор просто обязан рассказать о технологии потокового ввода-вывода. Тем более что при помощи функций sprintf и sscanf (см. Приложение №1) возможна «эмуляция потокового вывода» информации в строку текста, откуда её можно вывести средствами API системных библиотек ввода-вывода (таких как Windows API, GTK+, Qt и др.). В качестве «стандартных потоков», присутствующих в операционной системе всегда и никогда не удаляемых из оперативной памяти, используются следующие потоки (см. таблицу 06.I): * Стандартный поток ввода (обозначение: stdin, cin и др.) – используется для ввода символьных данных в программу. По-умолчанию этот поток закреплён за клавиатурой компьютера; * Стандартный поток вывода (обозначается как: stdout, cout и др.) – используется для вывода символьной информации, полученной в результате работы программы в «штатном режиме». По-умолчанию этот поток закреплён за экраном дисплея; * Стандартный поток ошибок (обозначение: stderr, cerr и др.) – используется для вывода символьных диагностических сообщений, ошибок и предупреждений, возникших в результате работы программы. По-умолчанию этот поток закреплён за экраном дисплея; Примечание: стандартный поток и поток ошибок разделены в связи с тем, что при перенаправлении вывода часто совсем не нужно записывать в результаты работы программы диагностические сообщения. Эти сообщения будут лишними, например, при формировании таблицы базы данных в виде текстового файла; * Стандартный поток печати (обозначение: stdprn и др.) – используется для вывода результатов работы программы на печать. По-умолчанию этот поток закреплён за текущим принтером в системе, подключённым к порту LPT1. В настоящее время этот поток почти не используется, поскольку чаще проще и безопаснее перенаправить стандартный поток вывода на принтер, чем разделять потоки отдельно для экрана и отдельно для принтера. Все остальные потоки создаются или уничтожаются с помощью функций открытия и закрытия файлов, на период чтения/записи/добавления информации в эти файлы. 5P9i0s8y19Z dt=Text 06.02. Ввод со стандартного потока ввода 1 Содержание 06.02.01. Ввод средствами языка Си 06.02.02. Ввод средствами языка C++ 06.02.03. Ввод средствами языка Basic 06.02.04. Ввод средствами языка Perl 06.02.05. Ввод средствами языка Python 06.02.06. Ввод средствами языка Turbo Prolog 06.02.07. Ввод средствами языка VBScript 06.02.08. Ввод средствами языка Java 5P9i0s8y19Z dt=Text 06.02.01. Ввод средствами языка Си 2 Ввод со стандартного потока в Си осуществляется при помощи следующих функций: * для ввода одиночного символа – функцию getchar; * для ввода строки символов без ограничения на длину – функцию gets; * для «форматированного ввода» символов и их преобразования в «двоичные значения» переменных – функцию scanf; С синтаксисом и правилами использования этих функций можно ознакомиться в приложении №I к данной лекции. Автор хочет отметить, что использование функций ввода со стандартного потока является небезопасным, а, следовательно, и нежелательным способом ввода данных из стандартного потока. По возможности, заменяйте эти функции функциями потокового чтения данных с «явным» указанием потоков и «длины» прочтённой строки. Пример 06.001 /* Файл ex06001.c */ /* Функция иллюстрирует потоковый ввод-вывод (как это делать нельзя)*/ #include #define STR_LENGTH 3 // Длина строки 3 символа void main() { char str[STR_LENGTH]; // Текстовый буфер char *s; // Временная переменна s = gets( str ); puts( s ); } Например, функция, приведённая в примере 06.001, при вводе строки: «aaaaaaaa\n», — вызовет аварийное завершение с ошибкой «переполнение буфера». Поскольку длина текстового буфера – 2 символа (последний символ – «нулевой», знак окончания строки '\0'), то лишние символы, введённые с клавиатуры, попадают в «запредельную» системную область данных. В этом случае происходит операция (прерывание) «отказ системы», и адрес этой системной области оказывается доступной «взломщику системы». Функции, приведённые в примерах 06.002 и 06.003, лишены этих недостатков; Пример 06.002 /* Файл ex06002.c */ /* Функция иллюстрирует потоковый ввод-вывод (как это делать надо)*/ #include #include #define BUF_LENGTH 7 // Длина строки 3 символа #define STR_LENGTH 2 // Длина буфера без дескриптора // Всё те же 2 символа void main() { char str[BUF_LENGTH]; // Текстовый буфер char *s, c = '\0'; // Временная переменная. int icsize; // Временная переменная. icsize = BUF_LENGTH - 2; str[0] = (char) icsize; s = cgets( str ); puts( s ); puts( "\nPress any key to continue..."); while( !( c = getch()) ); // Цикл пока не нажата клавиша } Пример 06.003 /* Файл ex06003.c */ /* Функция иллюстрирует потоковый ввод-вывод (как это делать надо)*/ #include #include #include #define STR_LENGTH 3 // Длина строки 3 символа void main() { char str[STR_LENGTH]; // Текстовый буфер char *s, c = '\0'; // Временная переменная. int icsize; // Временная переменная. memset( str, '\0', STR_LENGTH ); // Обнуляем буфер icsize = STR_LENGTH; s = fgets( str, icsize, stdin ); // Читаем не более 2 символов с входного потока // (вместе с нулевым символом) puts( s ); puts( "\nPress any key to continue..."); while( !(c = getch()) ); // Цикл пока не нажата клавиша } 5P9i0s8y19Z dt=Text 06.02.02. Ввод средствами языка C++ 2 Консольный потоковый ввод в языке C++ осуществляется при помощи операторов «>>», а также при помощи функций get, peek и ignore. Стандартный поток ввода в языке C++ обозначается как cin (см. таблицу 06.I). Таблица 06.I. Обозначение потоков в разных языках программирования. Описание функций для потокового ввода средствами языка C++ смотри в приложении №III к данной лекции. C помощью оператора «>>» можно осуществить как неформатированный, так и форматированный ввод-вывод. Однако автор советует для ввода использовать неформатированный ввод из потока с помощью функции cin.get, а затем «выделить и ввести» нужные двоичные значения при помощи функции sscanf (см. пример 06.004.). Пример 06.004. /* File ex06004.cpp */ /* Пример ввода-вывода средствами C++*/ #include #include #include #include #ifndef STR_LENGTH #define STR_LENGTH 35 // Длина строки 34 символа + завершающий символ '\0' #endif #ifndef INT_WIDTH #define INT_WIDTH 5 // Ширина под поле целого числа - 4 символов #endif void main( void ) { const char format_in[] = "%5d"; // Формат ввода const char format_out[] = "\nВведённое значение: %5d"; // Формат вывода char str[STR_LENGTH], c='\0'; int iValue; (void) memset( str, '\0', STR_LENGTH ); // Обнуляем строку; cout << "\nВведите число: "; cin.get( str, INT_WIDTH ); if( !sscanf( str, format_in, &iValue ) ) // Если ошибка ввода { cerr << "\nНичего не введено или неправильный формат данных!\nПрограмма завершена с ошибкой"; return; } (void) memset( str, '\0', STR_LENGTH ); // Обнуляем строку; if( sprintf( str, format_out, iValue ) == EOF ) // Если ошибка вывода { cerr << "\nНичего не выведено или неправильный формат данных!\nПрограмма завершена с ошибкой"; return; } cout << str; // Выводим сформированную строку cerr << "\nПрограмма завершена нормально"; cerr << "\nPress any key to continue..."; while( !(c = getch()) ); // Цикл пока не нажата клавиша } В этом примере для ввода символьной строки использовалась функция get, для вывода – оператор «<<», а для форматных преобразований – функции sprintf и sscanf. Описание функций sscanf и sprintf см. в приложении №I к данной лекции. Замечание: из личного опыта автора родился следующий совет: при работе с консолью, когда не требуется программирование фильтров и перенаправления потоков, лучше использовать консольные функции ввода-вывода. Для программирования фильтров, наоборот, требуется ввод-вывод исключительно файловыми потоковыми функциями. В обоих случаях для форматного преобразования необходимо использовать только функции sprintf и sscanf, предварительно проверив (т.н. «валидация») формат читаемых и записываемых символов. Во всех случаях нужно жёстко контролировать итоговую длину строки ввода-вывода. 5P9i0s8y19Z dt=Text 06.02.03. Ввод средствами языка Basic 2 Ввод данных с клавиатуры в Quick Basic осуществляется при помощи оператора INPUT, о котором подробно было сказано в лекции, посвящённой консольному вводу-выводу. Форматы этого оператора следующие: ОПЕРАТОР: INPUT НАЗНАЧЕНИЕ: Форматированный ввод переменных; СИНТАКСИС: INPUT [;] [«prompt»{; | ,}] <список переменных> ОПИСАНИЕ: Оператор осуществляет форматированный ввод значений переменных, перечисленных в строке <список переменных> в конце оператора. В качестве значений распознаются символы: «.», «0-9» и «A-Za-z». Строка «prompt» используется для вывода приглашения на ввод данных. Она представляет собой допустимую строку на Бейсике; ПРИМЕЧАНИЕ: 1. Оператор INPUT использует запятую как разделитель между именами переменных; 2. При клавиатурном вводе точка с запятой сразу после имени оператора позволяет курсору остаться на той же строке, с которой производится ввод после нажатия клавиши «Enter»; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. ОПЕРАТОР: LINE INPUT НАЗНАЧЕНИЕ: Не форматированный ввод строки в символьную переменную. СИНТАКСИС: LINE INPUT [;] [«prompt»;] <символьная переменная>$ ОПИСАНИЕ: Оператор осуществляет неформатированный ввод строки в указанную переменную. В качестве значений допускаются любые символы. Строка «prompt» используется для вывода приглашения на ввод данных. Она представляет собой допустимую строку на Бейсике; ПРИМЕЧАНИЕ: 1. Оператор LINE INPUT читает все символы до нажатия пользователем клавиши «Enter»; 2. При клавиатурном вводе точка с запятой сразу после имени оператора позволяет курсору остаться на той же строке, с которой производится ввод после нажатия клавиши «Enter»; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. Строка "prompt" представляет собой строку текста приглашения, предваряющую ввод данных. Пример 06.005. REM FILE EX06005.BAS REM ИЛЛЮСТРАЦИЯ ВВОДА-ВЫВОДА СРЕДСТВАМИ QUICK BASIC REM REM ВВОД ДАННЫХ О СЕБЕ INPUT "ВАШ ВОЗРАСТ? "; AGE% REM ВЫВОД И ОБРАБОТКА ДАННЫХ PRINT "ДОБРЫЙ ДЕНЬ, "; IF AGE% < 40 THEN PRINT "МОЛОДОЙ ЧЕЛОВЕК!" ELSE PRINT "ПАПАША!" INPUT "Press key Enter to Exit...", JUNK STOP END 5P9i0s8y19Z dt=Text 06.02.04. Ввод средствами языка Perl 2 Для чтения из файла или стандартного потока ввода (обычно это клавиатура) используется операция «ромб» (<>), которой в качестве операнда передаётся дескриптор файла, а в случае ввода данных с клавиатуры — никакого операнда. Также для ввода данных со стандартного потока используется предопределённый дескриптор файла STDIN (см. таблицу 06.I). Рассмотрим ввод этими средствами поподробнее: Содержание 06.02.04.01. Операция «ромб» 06.02.04.02. Выполнение системных команд 06.02.04.03. Ещё одно применение операции «ромб» 5P9i0s8y19Z dt=Text 06.02.04.01. Операция «ромб» 3 Основное предназначение операции — прочитать одну строку или все строки файла, дескриптор которого представляет собой операнд этой операции. Синтаксис этой операции следующий: $«переменная» = <«дескриптор»> [06.01] или @«переменная» = <«дескриптор»> [06.02] В этих синтаксических конструкциях значение (операнд) «дескриптор» для оператора ввода с клавиатуры опускается или заменяется ключевым словом STDIN. В первой конструкции в скалярную переменную записывается одна (очередная) строка из файла либо со стандартного потока ввода (до первого появления в строке файла псевдосимвола «EOL»). Во второй конструкции читаются все (оставшиеся) строки из файла. Особо отметим, что операция <> без операнда при первом своём появлении проверяет, пуст ли массив операндов программы @ARGV. Если он пуст, то программа переходит в режим ожидания ввода со стандартного устройства, то есть эта операция аналогична конструкции: . Если же этот массив не пуст, то программа трактует каждый параметр в строке как имя файла и считает, что строки этих файлов есть то, что пользователь вводит на стандартном устройстве ввода. Например, программа из примера 06.006 выводит на экран все строки файлов, перечисленные после него. Пример 06.006 #!perl -w # Файл ex06006.pl выводит в стандартный # поток вывода все строки файлов, перечисленных # после него # while( $line = <> ) { print $line; } print STDERR "\nPress key Enter to Exit.."; $junk = Так, конструкция [06.03] просто распечатывает самого себя (файл). perl ex06006.pl ex06006.pl [06.03] Приведём ещё примеры ввода-вывода стандартными средствами языка Perl: Пример 06.007. #!perl -w # File ex06007.pl # Реализация примера 06.004 на языке Perl # print "\nВведите число: "; $ivalue = ; print "\nВведённое значение: $ivalue"; # Завершение работы print STDERR "\nPress key Enter to Exit..."; $junk = ; # Конец файла Пример 06.008 #!perl -w # File ex06008.pl # Проверка на наличие ключей, переданных программе # while( $_ = $ARGV[0], /^-/) { if(/^-d/||/^-s/||/^-e/) { print $ARGV[0]."\n"; } else { print "\nНеизвестный ключ $ARGV[0]\n"; } shift; } # Завершение работы print STDERR "\nPress key Enter to Exit..."; $junk = ; # Конец файла При вычислении условий цикла while осуществляется присвоение переменной «$_» значения первого элемента массива @ARGV, и проверка наличия дефиса (-) в качестве первого символа (оператор /^-/). Далее оператор if проверяет содержимое переменной $_ на соответствие известным опциям. Функция shift удаляет из массива @ARGV первое значение, сдвигая оставшиеся в нём элементы влево. 5P9i0s8y19Z dt=Text 06.02.04.02. Выполнение системных команд 3 Заключённая в обратные апостроф (`) строка или выражение, находящееся внутри записи операции «qx{…}», вызывает выполнение команды операционной системы. Когда интерпретатор Perl встречает строковый литерал в обратных апострофах, то, после подстановки значений скалярных переменных и элементов массива, интерпретатор передаёт получившуюся строку как команду на выполнение операционной системе. Операция заключения строки символов в обратные апострофы различает скалярный и списковый контексты. В скалярном контексте возвращается одна строка, содержащая в себе весь вывод на экран монитора, включая псевдосимволы «EOL». В списковом контексте возвращается список значений. Каждый элемент списка содержит одну строку вывода выполненной команды операционной системы. В списковом контексте разбиение вывода команды операционной системы на элементы списка выполняется в соответствии со значением переменной «$/», являющимся разделителем. По-умолчанию это значение — "\n" («EOL»). Если этой переменной присвоить другое значение, то будет использовано это значение для разбиения «вывода на строки». Этим разделителем может быть любая последовательность символов. Приведём примеры выполнения операции ввода с использованием обратных апострофов. Пример 06.009. #!perl -w # File ex06009.pl # Операция заключения в обратные кавычки # в скалярном и списковом контекстах. $command = "dir"; # Печать содержимого каталога $scalar = `$command`; # Скалярный контекст @list = `$command`; # Списковый контекст print "\nСодержимое скалярной переменной\n"; print "-"x80; print $scalar; print "-"x80; print "\nСодержимое трёх первых строк вывода\n"; print $list[0].$list[1].$list[2]."\n"; print "-"x80; # Завершение работы print "\n"; print STDERR "\nPress key Enter to Exit..."; $junk = ; # Конец файла Пример 06.010. #perl -w # # Программа для перевода имён файлов в MS WINDOWS в верхний регистр. # # Синтаксис: # >perl ex06010.pl [аргументы…] # # где аргументы — имена файлов и каталогов # # ЗАМЕЧАНИЕ: # Функция не переименовывает файлы и каталоги, в именах которых # есть умляуты и кириллические символы # # $oldFileName = shift() or die "\nNo arguments"; # Читаем первый параметр скрипта while( 1 ) { # Цикл ПОКА есть параметры скрипта в командной строке # $newFileName = uc( $oldFileName); # Все символы в имени — в верхний регистр! qx{ren $oldFileName $newFileName}; # Переименование файла $oldFileNane = shift() or die"\nThe End of a script"; # Читаем следующий параметр скрипта или выход } # Конец процедуры Пример 06.011. #perl -w # # Программа для перевода имён файлов в MS WINDOWS в нижний регистр. # # Синтаксис: # >perl ex06011.pl [аргументы…] # # где аргументы — имена файлов и каталогов # # ЗАМЕЧАНИЕ: # Функция не переименовывает файлы и каталоги, в именах которых # есть умляуты и кириллические символы # # $oldFileName = shift() or die "\nNo arguments"; # Читаем первый параметр скрипта while( 1 ) { # Цикл ПОКА есть параметры скрипта в командной строке # $newFileName = lc( $oldFileName); # Все символы в имени -- в нижний регистр! qx{ren $oldFileName $newFileName}; # Переименование файла $oldFileNane = shift() or die"\nThe End of a script"; # Читаем следующий параметр скрипта или выход } # Конец процедуры 5P9i0s8y19Z dt=Text 06.02.04.03. Ещё одно применение 3 операции «ромб» Ещё одно применение операции «ромб» состоит в получении имён файлов определённого каталога, удовлетворяющему заданному шаблону. В скалярном контексте «ромб» возвращает первое найденное имя файла в текущем каталоге, в списковом контексте — список имён всех файлов, удовлетворяющих заданному шаблону. В шаблонах допускается использовать метасимволы «*» и «?». Пример иллюстрирует печать имён всех файлов с расширением «*.pl» Пример 06.012. #!perl -w # File ex06012.pl # печать имён всех файлов с расширением "*.pl" while ( $file = <*.pl> ) { print "$file\n"; } # Завершение работы print STDERR "\nPress key Enter to Exit..."; $junk = ; # Конец файла 5P9i0s8y19Z dt=Text 06.02.05. Ввод средствами языка Python 2 Для ввода строки символов с клавиатуры используется встроенная функция raw_input. Её описание смотри ниже. ФУНКЦИЯ RAW_INPUT ОПРЕДЕЛЕНА В: Встроенная функция СИНТАКСИС: value = raw_input([prompt]), где value — вводимая строка текста; prompt — необязательная подсказка для ввода текста; НАЗНАЧЕНИЕ: Ввод строки символов с клавиатуры; ОПИСАНИЕ: Функция вводит с клавиатуры строку до символа перевода строки. Если при вводе встречается символ конца файла «EOF», то возбуждается исключение EOFError. ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Введённая строка символов. ФУНКЦИЯ INPUT ОПРЕДЕЛЕНА В: Встроенная функция; СИНТАКСИС: input([prompt]), где prompt — необязательная подсказка для ввода текста; НАЗНАЧЕНИЕ: Ввод с клавиатуры строки кода Питона; ОПИСАНИЕ: Функция вводит с клавиатуры код Питона, что эквивалентно вызовам функций eval(raw_input()). Функция не защищена от ошибок пользователя, и вызывает исключение SyntaxError при ошибке синтаксиса. В-общем функция используется для быстрого ввода кода. В любых других случаях лучше использовать функцию raw_input(); ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет. Пример 06.013. #! %PYTHON%/python # -*- coding: cp866 -*- # Файл ex06013.py def ex06013(): while 1: # Попытка ввода целого числа try: print 'Введите целое число: ' number = int( raw_input() ) break except ValueError: print "Вы ошиблись. Попробуйте ещё раз..." print 'Введённое значение - %10d' % number; # Завершение программы junk = raw_input( 'Press key Enter to Exit...') # Конец программы Пример 06.014. #! %PYTHON%/python # -*- coding: cp866 -*- # Файл ex06014.py def ask_ok(prompt, retries=4, complaint='Да или Нет, пожалуйста!'): while 1: ok = raw_input( prompt ) if ok in ('д', 'да', 'Д', 'Да'): return 1 if ok in ('н', 'не', 'нет', 'Н', 'НЕ', 'НЕТ', 'Нет'): return 0 retries = retries - 1 if retries < 0: raise IOError( 'Пользователь отказывается отвечать') print complaint def ex06014(): print 'Начало функции' ok = ask_ok('Да или Нет? ') if ok == 1 : print 'нажато Да' if ok == 0 : print 'нажато Нет' # Завершение программы junk = raw_input( 'Press key Enter to Exit...') # Конец программы ФУНКЦИЯ READ ОПРЕДЕЛЕНА В: Везде СИНТАКСИС: value = f.read([«число_байт»]), где value — прочтённая строка; f — дескриптор файла; «число_байт» — количество прочтённых байт; НАЗНАЧЕНИЕ: Чтение из файла числа байтов, указанных в качестве аргумента; ОПИСАНИЕ: Данный метод читает из файла с дескриптором f, открытым для чтения, числа байтов, указанных в качестве аргумента. Если метод выполняется без параметров, то читается весь файл. И если он прочитан до конца, то метод возвращает пустую строку. ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Строка текста, прочтённая из файла; ФУНКЦИЯ READLINE ОПРЕДЕЛЕНА В: Везде СИНТАКСИС: value = f.readline(), где value — прочтённая строка; f — дескриптор файла; НАЗНАЧЕНИЕ: Чтение одной строки из файла; ОПИСАНИЕ: Данный метод читает одну строку из файла с дескриптором f до символа перевода строки «EOL» (включая сам этот символ). Если строка состоит только из символа перевода строки, то метод readline возвращает пустую строку. Если в конце файла нет пустой строки с символом «EOL», то возвращаемый результат не определён (этого допускать нельзя)! ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Введённая строка символов. В качестве дескриптора файла можно указать стандартный дескриптор sys.stdin (дескриптор стандартного потока ввода, Таблица 06.I). ФУНКЦИЯ READLINES ОПРЕДЕЛЕНА В: Везде; СИНТАКСИС: value = f.readlines([«размер_строки»]), где value — переменная-список; f — дескриптор файла; «размер_строки» — необязательный параметр длины строки с текстом; НАЗНАЧЕНИЕ: Чтение всех строк файла в список; ОПИСАНИЕ: Функция читает все строки файла в переменную список. Если строка с текстом имеет меньшую длину, чем указанная в фактическом параметре «размер_строки», то файл читается дальше до достижения указанного числа символов. Метод чтения всех строк эффективен для чтения очень больших файлов построчно; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Список текстовых строк из всего файла; 5P9i0s8y19Z dt=Text 06.02.06. Ввод средствами языка Turbo Prolog 2 Для ввода символов с консоли в языке Turbo Prolog существуют следующие функции. ФУНКЦИЯ readln СИНТАКСИС: readln(StringVariable) где StringVariable – переменная типа string, «возвращаемая». НАЗНАЧЕНИЕ: Данная функция считывает с консоли символы и записывает её в переменную StringVariable строкового типа. Строка считывается до первого символа 'EOL'; ШАБЛОНЫ: (o); ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Неудача, когда встретится конец файла, когда при вводе нажата клавиша «Esc»; ОШИБКИ: Функция не возвращает ошибочных значений; ФУНКЦИЯ: readint СИНТАКСИС: readint(IntgVariable) где IntgVariable – переменная типа integer, «возвращаемая»; НАЗНАЧЕНИЕ: Данная функция считывает с консоли символы и записывает её в целую переменную IntgVariable. Ввод завершается нажатием клавиши «Enter» на клавиатуре. ШАБЛОНЫ: (o); ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Неудача, когда встретится конец файла, когда при вводе нажата клавиша «Esc», когда введено не целое значение; ОШИБКИ: Функция не возвращает ошибочных значений; ФУНКЦИЯ: readreal СИНТАКСИС: readreal(RealVariable) где RealVariable – переменная типа real, «возвращаемая»; НАЗНАЧЕНИЕ: Данная функция считывает с консоли символы и записывает её в переменную RealVariable типа real. Ввод завершается нажатием клавиши «Enter» на клавиатуре. ШАБЛОНЫ: (o); ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Неудача, когда встретится конец файла, когда при вводе нажата клавиша «Esc», когда введено не числовое значение; ОШИБКИ: Функция не возвращает ошибочных значений; ФУНКЦИЯ: readchar СИНТАКСИС: readchar(CharVariable) где CharVariable – переменная типа char, «возвращаемая»; НАЗНАЧЕНИЕ: Данная функция считывает с консоли с эхо печатью одиночный символ и записывает его код в переменную CharVariable типа char. Ввод завершается нажатием клавиши «Enter» на клавиатуре. ШАБЛОНЫ: (o); ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Неудача, когда встретится конец файла; ОШИБКИ: Функция не возвращает ошибочных значений; ПРИМЕЧАНИЕ: Конструкция readchar(_) означает: «пока не нажата клавиша». Пример функции на языке Пролог для ввода числа (реализация алгоритма из примера 06.004). Пример 06.015. /* Файл ex06015.pro */ domains /* Описываем переменные */ IValue = integer goal /* Выполняем функцию */ write( "\nВведите число: "), readint( IValue ),nl, writef( "\nВведённое число -- %d", IValue ), nl, write( "Press key Enter to Exit..." ), readchar( _ ). 5P9i0s8y19Z dt=Text 06.02.07. Ввод средствами языка VBScript 2 Для ввода символов с консоли в языке VBScript существуют следующие функции. ФУНКЦИЯ READ ОПРЕДЕЛЕНА В: WScript; СИНТАКСИС: WScript.StdIn.Read(n), где n — число символов, которое необходимо прочесть; НАЗНАЧЕНИЕ: Чтение n символов из стандартного потока ввода StdIn; ОПИСАНИЕ: Функция считывает из потока StdIn заданное параметром n число символов и возвращает полученную строку; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Строка символов, прочтённая с клавиатуры; ПЕРЕНОСИМОСТЬ: Только сценарии CScript; ФУНКЦИЯ READALL ОПРЕДЕЛЕНА В: WScript; СИНТАКСИС: WScript.StdIn.ReadAll(); НАЗНАЧЕНИЕ: Читает все символы из потока StdIn; ОПИСАНИЕ: Функция читает символы из потока StdIn до тех пор, пока не встретится символ конца файла «EOF» (ASCII 26, +), и возвращает полученную строку; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Весь текст в одну строку; ПЕРЕНОСИМОСТЬ: Только сценарии CScript; ФУНКЦИЯ READLINE ОПРЕДЕЛЕНА В: WScript; СИНТАКСИС: WScript.StdIn.ReadLine(); НАЗНАЧЕНИЕ: Чтение строки символов из потока StdIn; ОПИСАНИЕ: Функция читает символы из потока StdIn до тех пор, пока не встретится символ конца строки «EOL», и возвращает полученную строку; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Возвращает строку, считанную из потока StdIn; ПЕРЕНОСИМОСТЬ: Только сценарии CScript; ФУНКЦИЯ SKIP ОПРЕДЕЛЕНА В: WScript; СИНТАКСИС: WScript.StdIn.Skip(n), где n — число пропускаемых символов; НАЗНАЧЕНИЕ: Пропускает при чтении из потока StdIn заданное параметром n число символов; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет; ПЕРЕНОСИМОСТЬ: Только сценарии CScript; ФУНКЦИЯ SKIPLINE ОПРЕДЕЛЕНА В: WScript; СИНТАКСИС: WScript.StdIn.SkipLine(); НАЗНАЧЕНИЕ: Пропускает целую строку при чтении из потока StdIn ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет; ПЕРЕНОСИМОСТЬ: Только сценарии CScript; Пример функции на языке Visual Basic Script для ввода числа (реализация алгоритма из примера 06.004). Пример 06.016. '******************************************************************** ' Имя: ex06016.vbs ' Язык: VBScript ' Описание: Пример функции для чтения и вывода целого числа '******************************************************************** Option Explicit Dim s, junk ' Определение переменных WScript.StdOut.Write( "Введите число (до 4-х символов): ") s = WScript.StdIn.Read(4) WScript.Echo vbCrLf & "Введённое число - " & s & vbCrLf ' Завершение работы с программой (только CScript) WScript.StdErr.WriteLine( "Press key Enter to Exit...") junk = WScript.StdIn.ReadLine() '************* Конец ********************************************* 5P9i0s8y19Z dt=Text 06.02.08. Ввод средствами языка Java 2 Автор рекомендует для ввода данных с клавиатуры на языке Java использовать класс SavitchIn, описанный в Приложении №4 к данной лекции. Ниже приведён пример на языке Java реализации алгоритма из примера 06.004. Пример 06.017. /* File ex06017.java */ /* Данный пример требует наличие компилированного класса SavitchIn */ import java.io.*; import java.util.*; // Файл ex06017.java public class ex06017 { public static void main( String[] args ) { int iValue; String junk; System.out.print( "Введите целое число: " ); iValue = SavitchIn.readLineInt(); System.out.println( "Введённое число -- " + iValue ); /* Завершение работы программы */ System.out.println( "Press key Enter to exit..." ); junk = SavitchIn.readLine(); } } 5P9i0s8y19Z dt=Text 06.03. Резюме стандартного 1 буферизированного ввода-вывода На данной лекции Вы ознакомились с поточным (буферизированным) вводом-выводом, изучили функции потокового ввода на разных языках программирования, и научились писать программы с их использованием. На следующей лекции Вы закрепите материал по потоковому вводу-выводу, а затем узнаете о функциях открытия, закрытия и манипуляциями файлового буфера. На данной лекции автор специально опускает материал, касающийся организации потокового ввода-вывода на языке Ассемблер, поскольку эти функции в нём реализованы не очевидно, и разбираться с их работой требует отдельного курса лекций. В заключение отмечу, что при помощи функций буферизированного ввода-вывода очень легко писать программы - фильтры для работы в командной строке операционной системы. Именно функции потокового ввода-вывода являются «переносимыми между всеми платформами и операционными системами». 5P9i0s8y19Z dt=Text 06.04. Вопросы и упражнения. 1 5P9i0s8y19Z dt=Text 06.05. Г Л О С С А Р И Й 1 5P9i0s8y19Z dt=Text 06.06. Приложение №1 1 Описание функций sprintf и sscanf ФУНКЦИЯ SPRINTF ОПРЕДЕЛЕНА В: СИНТАКСИС: int sprintf( buffer, format_string[, argument...]); char *buffer — символьная строка, в которую записывается результат вывода переменных, заданных параметрами argument, отформатированных с помощью строки форматов; const char *format_string — строка форматов для вывода аргументов; НАЗНАЧЕНИЕ: Вывод значений переменных в заданный буфер при помощи строки форматов; ОПИСАНИЕ: Функция sprintf форматирует и выводит последовательности символов и значений аргументов в символьный массив, адрес которого задаётся значением аргумента buffer. Каждый аргумент преобразуется и выводится согласно соответствующей спецификации в строке, адрес которой задаётся значением параметра format_string. Строка описания формата вывода интерпретируется так же, как и для функции printf. ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Число символов, помещённых в строку, адрес которой задаётся значением параметра buffer. ПЕРЕНОСИМОСТЬ: Стандарт ANSI, работает во всех реализациях Си; ФУНКЦИЯ SSCANF ОПРЕДЕЛЕНА В: СИНТАКСИС: int sscanf( buffer, format_string[, argument...]); const char *buffer — символьная строка, из которой считывается значения переменных, заданных параметрами argument и формируемых с помощью строки форматов; const char *format_string — строка форматов для ввода аргументов; НАЗНАЧЕНИЕ: Чтение значений переменных из заданного буфера при помощи строки форматов; ОПИСАНИЕ: Функция sscanf читает данные из символьного массива, адрес которого задаётся значением переменной buffer, в переменные, адреса которых задаются аргументами arguments. Каждый аргумент должен быть указателем на переменную с типом, соответствующему типу, определённому в строке описания формата, адрес которой задаётся значением параметра format_string. Строка описания формата управляет интерпретацией входных полей и имеет тот же вид, что и для функции scanf. ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Число полей, которые были успешно преобразованы и присвоены. Возвращаемое значение не включает поля, которые были прочитаны, но не были присвоены. Значение EOF, если была попытка прочитать символ конца строки. Значение «0», если не было присвоенных полей. ПЕРЕНОСИМОСТЬ: Стандарт ANSI, работает во всех реализациях Си; ФУНКЦИЯ scanf ОПРЕДЕЛЕНА В: СИНТАКСИС: int scanf( format_string[,argument…] ); char *format_string; НАЗНАЧЕНИЕ: Функция scanf читает данные из стандартного потока ввода stdin в переменные, адреса которых задаются аргументами arguments. Функция имеет переменное число параметров; ОПИСАНИЕ: Значение параметра format_string задаёт адрес строки, которая управляет интерпретацией вводимых полей. Каждый последующий аргумент должен быть указателем на переменную типа, соответствующей типу, определённой в строке формата. Строка описания формата ввода может содержать: * Пробельные символы: ' ', '\t', '\n'. Если пробельный символ встретился в строке формата, то с этого момента пробельные символы считываются из потока ввода вплоть до первого символа, не являющимися пробельным, но не участвуют в присвоении значений (т.е. игнорируются); * Печатные символы – все прочие символы, не являющиеся символом '%', эти символы считываются из потока и проверяются на соответствие символам строки формата. Если нет совпадения символов в строке и стандартном потоке, считывание символов прекращается, и функция возвращает ошибку; * Спецификация формата, начинающаяся со знака '%'. Спецификация формата заставляет функцию прочитать и преобразовать символы на входе в значение указанной аргументах переменной. Значение присваивается переменной, адрес которой указан в списке аргументов; Строка форматов читается слева направо. Входное поле, выделяемое из потока ввода, включает в себя все символы вплоть до первого пробельного символа, первого символа, который не может быть преобразован в значение переменной в соответствии со спецификацией, или когда прочитано число символов, определённой в модификаторе width. Лишние символы из входного потока игнорируются. При задании аргументов меньше, чем в строке формата, результат не определён; ПРИМЕЧАНИЕ: 1. SCANF часто приводит к непредсказуемым результатам, когда Вы отклоняетесь от точного шаблона. Вам следует помнить, что нужно указывать функции scanf, каким образом синхронизировать конец строки. В результате бывает предпочтительней комбинация из вызовов функций fgets и sscanf последовательно друг за другом; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Число полей, которые были успешно преобразованы и присвоены. Возвращаемое значение не содержит полей, которые были прочитаны, но не присвоены; EOF – Если была сделана попытка прочитать конец файла; 0 – если не было присваивания полей; ПЕРЕНОСИМОСТЬ: Функция scanf поддерживается в операционных системах, основанных на UNIX, определена в стандарте ANSI C. Также функция определена в стандарте Кернигана и Ритчи. ФУНКЦИЯ: gets ОПРЕДЕЛЕНА В: СИНТАКСИС: char *gets( s ); char *s; НАЗНАЧЕНИЕ: Функция получает строку из потока; ОПИСАНИЕ: Функция gets читает строку символов, оканчивающуюся символом перевода строки, в переменную s из стандартного входного потока stdin. Данная символьная строка оканчивается символом перехода на новую строку, который при записи в s заменяется нулевым окончанием '\0'; ЗАМЕЧАНИЯ: 1. В отличие от scanf, gets позволяет вводить строки, содержащие символы пробела и табуляции. Всё, что было введено до перевода каретки, помещается в s; 2. ВНИМАНИЕ! Данная функция может вызывать ошибки типа: «переполнения буфера», и с её помощью хакер может получить контроль над Вашим компьютером. При возможности заменяйте эту функцию функцией fgets; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция gets возвращает строку s. При достижении конца файла (EOF) или ошибке возвращается NULL; ПЕРЕНОСИМОСТЬ: Функция поддерживается на операционных системах, основанных на UNIX и стандартом ANSI C. ФУНКЦИЯ: getc ОПРЕДЕЛЕНА В: СИНТАКСИС: int getc( stream ); FILE *stream; НАЗНАЧЕНИЕ: Функция вводит из потока символ; ОПИСАНИЕ: Функция getc представляет собой макрокоманду, которая получает следующий по-порядку символ из входного потока stream и увеличивает указатель текущего положения в потоке на единицу; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция getc возвращает считанный символ после предварительного его преобразования в целый тип. При возникновении ситуации «конец файла» и при ошибке ввода она возвращает значение EOF; ПЕРЕНОСИМОСТЬ: Функция поддерживается в операционных системах UNIX, поддерживается стандартом ANSI C, и описана в стандарте Кернигана и Ритчи. ФУНКЦИЯ: getchar ОПРЕДЕЛЕНА В: СИНТАКСИС: int getchar(); НАЗНАЧЕНИЕ: Функция вводит символ из потока stdin; ОПИСАНИЕ: getchar – это макрокоманда, вводящая символ из потока stdin Она определена следующим образом: getc( stdin ); ЗАМЕЧАНИЕ: getchar читает символы с stdin, который имеет буфер на одну строку. Поэтому она ничего не возвращает до тех пор, пока вы не нажмёте Enter; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: При успешном завершении функция getchar возвращает считанный символ после предварительного преобразования его в целый тип. При ошибке оно возвращает значение EOF; ПЕРЕНОСИМОСТЬ: Функция поддерживается в операционных системах UNIX, стандартом ANSI C, и описана в стандарте Кернигана и Ритчи. 5P9i0s8y19Z dt=Text 06.07. Приложение №2 1 Описание опций формата функций scanf и printf СПЕЦИФИКАЦИЯ ФОРМАТА ФУНКЦИИ PRINTF СИНТАКСИС: %[flags][width][.precision][F|N|h|l|L]type, где flags – определяет выравнивание выводимых символов, управление печатью знаковых символов ('+' и '-'), пробелов, десятичных точек, восьмеричных и шестнадцатеричных префиксов. Значения полей см. в таблице 06.III.; width – положительное целое десятичное число, определяющее минимальное число выводимых символов. Если число символов в выводном значении меньше, чем определено в width, то пробелы дополняются справа или слева (в зависимости от значения флага). Спецификация никогда не вызывает обрезание значащих символов в выводимом значении, всегда печатаются все символы. Обрезание значений возможно только при указании параметра: precision. Если в поле width спецификации стоит знак «звёздочка», то в этом случае сам текущий аргумент из списка аргументов (имеющий тип int) предполагается как значение, задающее минимальное количество символов. Это значение задаётся переменной в списке аргументов, она должна предшествовать выводимому значению; precision – неотрицательное целое число, определяет точное число символов, которые должны быть напечатаны, или место десятичной точки. Позволяет сузить и округлить значение вещественных (не целых) чисел. Если в поле precision спецификации стоит знак «звёздочка», то в этом случае сам текущий аргумент из списка аргументов (имеющий тип int) предполагается как значение, задающее минимальное количество символов. Это значение задаётся переменной в списке аргументов, она должна предшествовать выводимому значению. Смысл параметра precision приведён в Таблице 06.IV.; F – префикс к аргументу, указывающий, что используется «дальний указатель» на память; N – префикс к аргументу, указывающий, что используется «ближний» указатель на память; l – указывает, что используется «длинная» («long») разновидность типа данных (например, long int); h – указывает, что используется «короткая» («short») разновидность данных (например, short int); Спецификация форматов не содержит внутри себя пробелы, каждое её поле – одиночный символ или число. Символ type, который появляется после последнего поля формата, должен соответствовать типу выводимых значений переменной; значение символа type указано в таблице 06.III.; СПЕЦИФИКАЦИЯ ФОРМАТА ФУНКЦИИ SCANF СИНТАКСИС: %[*][width][F|N][h|l|L]type, где Знак '*', следующий за символом процента, запрещает присваивание полученного значения по адресу, заданного аргументом. Поле считывается, но в значение в память не записывается; width – положительное десятичное целое число, определяющее максимальное число символов, которые будут прочитаны из потока stdin согласно спецификации аргумента. Не более чем width считываются и участвуют в присвоении значения, но если встречается пробельный символ или символ, не преобразуемый в указанном формате, ввод завершится раньше; F – префикс к аргументу, указывающий, что используется «дальний указатель» на память; N – префикс к аргументу, указывающий, что используется «ближний» указатель на память; l – указывает, что используется «длинная» («long») разновидность типа данных (например, long int); h – указывает, что используется «короткая» («short») разновидность данных (например, short int); значение символа type указано в таблице 06.II. Описание строки форматов функции writef на языке PROLOG: ЗНАЧЕНИЯ СТРОКИ ФОРМАТОВ: ––––––––––––––––––––––––––––----------- спецификация что она означает ––––––––––––––––––––––––––––----------- - (дефис) показывает, что поля выравниваются слева; правое выравнивание действует по умолчанию (необязательный параметр). m поле десятичное число, описывающее минимальный размер поля (необязательный параметр). .p поле описывает или точное представление числа с плавающей точкой, или максимальное количество напечатанных в строке символов (необязательный параметр). f поле описывает другие форматы, которые умалчиваются для данного объекта (необязательный параметр). –––––––––––––––––––––––––––- –––––––––––––––––––––––––– описание в f поле что оно означает –––––––––––––––––––––––––– f Формат вещественного в фиксированной десятичной системе счисления (такой, как 123.4 или 0.004321). lf Формат вещественного в фиксированной десятичной системе счисления (такой, как 123.4 или 0.004321). Используется для совместимости с языком Си. e Формат вещественного в экспоненциальной форме представления. g Формат вещественного в коротком формате (это используется по умолчанию для вещественного). d Формат символов или целых чисел как десятичное число. u Формат символов или целых чисел как десятичное число без знака. x Формат символов или целых чисел как шестнадцатеричного числа. с Формат символов или целых чисел как символа. R Использует аргумент как ссылку на номер указателя базы данных (только ref домен). X Использует аргумент как длинное шестнадцатеричное число (строки, номер указателя базы данных). s Формат как строка (символов и строк). ––––––––––––––––––––––––––– СПЕЦИАЛЬНЫЕ СИМВОЛЫ: \n - Новая строка (EOL); \t - Горизонтальная табуляция; \nnn - Символ с кодом nnn в текущей кодировке; Таблица 06.II Спецификации формата функции scanf <> Таблица 06.III Спецификация форматов функции printf <> Таблица 06.IV Флаги функции printf и их интерпретация. <> 5P9i0s8y19Z dt=Text 06.08. Приложение №3 1 Описание функций потокового ввода-вывода средствами языка С++ Для потокового ввода-вывода данных (например, при чтении из стандартного потока или при записи в стандартный поток вывода или ошибок) используются следующие функции, являющиеся методами классов istream и ostream ОПЕРАТОР << (вывода) ОПРЕДЕЛЁН В: СИНТАКСИС: ostream << argument[ << arguments…]; НАЗНАЧЕНИЕ: Оператор осуществляет вывод в поток ostream аргументов; ОПИСАНИЕ: Оператор «<<» осуществляет вывод в поток ostream (которым может быть любой поток вывода), указанных после его знака аргументов. Порядок «вычисления» аргументов производится слева направо; ПРИМЕЧАНИЕ: В заголовочном файле определены операции вывода строки символов, целых, длинных целых значений и значений с плавающей точкой двойной точности. При выводе других значений необходимо «явное» приведение типов; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Ссылка на поток ostream, в который был произведён вывод; ОПЕРАТОР >> (ввода) ОПРЕДЕЛЁН В: СИНТАКСИС: istream >> argument[ >> arguments…]; НАЗНАЧЕНИЕ: Оператор осуществляет ввод аргументов из потока istream; ОПИСАНИЕ: Оператор «>>» осуществляет ввод из входного потока istream (которым может быть любой поток ввода), указанных после его знака аргументов. Порядок ввода элементов из потока – слева направо. Вводимые значения должны соответствовать объявленному типу и должны разделяться пробелом (пробелами); ПРИМЕЧАНИЕ: В заголовочном файле оператора определены операции ввода строки символов, одинокого символа, короткого целого, целого и длинного целого числа, чисел с плавающей точкой пониженной и удвоенной разрядности. При выводе других значений необходимо «явное» приведение типов. Оператор не вводит пробельных символов; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Ссылка на поток istream, из которого был произведён ввод; ФУНКЦИЯ istream.get ОПРЕДЕЛЕНА В: СИНТАКСИС: istream.get( ch ); char &ch; НАЗНАЧЕНИЕ: Функция ввода одиночного символа; ОПИСАНИЕ: Указанная функция просто читает один символ и помещает его в свой аргумент. Функция может читать любые символы, в том числе «пробельные» и «двоичные»; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Ссылка на поток istream, из которого был произведён ввод; ПРИМЕЧАНИЕ: Вследствие этого несколько функций .get, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore. ФУНКЦИЯ istream.get ОПРЕДЕЛЕНА В: СИНТАКСИС: istream.get( p, n, z='\n' ); char *p; int n; int z; НАЗНАЧЕНИЕ: Функция чтения из потока строки символов; ОПИСАНИЕ: Указанная функция читает и размещает по адресу, заданному первым аргументом, не более символов, заданных вторым аргументом По-умолчанию функция get прочтёт не более чем n символов и не более чем одну строку. Последнее ограничение определяется третьим аргументом – он задаёт символ ограничитель строки, который в операционных системах по-умолчанию является '\n'. Функция позволяет вводить пробельные символы; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Ссылка на поток istream, из которого был произведён ввод; ПРИМЕЧАНИЕ: Вследствие этого несколько функций .get, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore; ФУНКЦИЯ istream.peek ОПРЕДЕЛЕНА В: СИНТАКСИС: char istream.peek(); НАЗНАЧЕНИЕ: Функция возвращает следующий символ из потока; ОПИСАНИЕ: Указанная функция возвращает следующий символ из потока, но не удаляет его из потока; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Прочитанный символ или EOF, если достигнут конец потока или произошла ошибка ввода данных; ФУНКЦИЯ istream.ignore ОПРЕДЕЛЕНА В: СИНТАКСИС: istream.ignore( Limit = 1, Delim = EOF ); int Limit; int Delim; НАЗНАЧЕНИЕ: Функция пропускает заданное количество символов; ОПИСАНИЕ: Указанная функция пропускает заданное количество символов (по умолчанию – 1) и останавливается, если встречает символ Delim. По-умолчанию, если не заданы никакие аргументы, функция .ignore() пропускает один символ и останавливается, если встречает конец файла; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Ссылка на поток istream, из которого был произведён ввод; ПРИМЕЧАНИЕ: Вследствие этого несколько функций .ignore, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore; ФУНКЦИЯ ostream.put ОПРЕДЕЛЕНА В: СИНТАКСИС: ostream.put( ch ); char ch; НАЗНАЧЕНИЕ: Функция выводит одиночный символ; ОПИСАНИЕ: Указанная функция выводит одиночный символ в поток ostream (которым может быть любой поток вывода). Функция может вывести даже «двоичный символ»; ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Ссылка на поток ostream, куда был произведён вывод; ПРИМЕЧАНИЕ: Вследствие этого несколько функций .put, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .put и .write; ФУНКЦИЯ ostream.write ОПРЕДЕЛЕНА В: СИНТАКСИС: ostream.write( buf, n); const char *buf; int n; НАЗНАЧЕНИЕ: Функция выводит буфер buf; ОПИСАНИЕ: Указанная функция выводит в поток ostream (которым может любой выходной поток) не более чем n символов из буферной строки buf. При этом буфер может содержать не только текстовые, но и двоичные данные! ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Ссылка на поток ostream, куда был произведён вывод; ПРИМЕЧАНИЕ: Вследствие этого несколько функций .write, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .put и .write; Дополнительную информацию о функциях и операторах потокового ввода-вывода данных в C++ смотри [10, 30] 5P9i0s8y19Z dt=Text 06.09. Приложение №4 1 Описание класса SavitchIn из [26] Класс, обеспечивающий ввод данных с консольного устройства. Данный класс был разработан автором [26] Уолтером Савитчем для некоммерческого использования с целью обучения программированию. Сайт учебного пособия [26] (на английском языке) расположен по адресу: http://www.cse.ucsd.edu/users/savitch/books/cs1.java/ Класс предназначен, главным образом, для простого консольного ввода данных (по одному значению на строку). Если пользователь вводит некорректное значение, т.е. значение неверного типа или пустую строку, пользователю предлагается повторить ввод данного, и разъясняется, что именно от него требуется. Класс также включает некоторые дополнительные методы ввода одинарных чисел, слов и отдельных символов без перехода на следующую строку. Данный класс включает в себя следующие функции: * readLine(); * readLineWord(); * readLineInt(); * readLineLong(); * readLineDouble(); * readLineFloat(); * readLineNonwhiteChar(); * readLineBoolean(); * readChar(); * readInt(); * readLong(); * readDouble(); * readFloat(); * readWord(); * readLineByte(); * readLineShort(); * read(); Текст функций данного класса (на языке Java) смотри в архиве примеров к данному курсу. 5P9i0s8y19Z