В операционных системах корпорации Microsoft (начиная с версии MS-DOS 2.0) и всех "клонах" UNIX существует возможность "потокового ввода-вывода" данных, например, на консоль, на принтер или в файл.
Принцип "потокового ввода-вывода" следующий:
В буфер заносятся только символьные данные. Как следствие, при потоковом выводе нельзя (или "практически нельзя") изменить атрибуты выводимых символов, их шрифтовое и абзацное оформление и т.д. Кроме того, в стандартные
Вследствие вышесказанного автор просто обязан рассказать о технологии потокового ввода-вывода. Тем более что при помощи функций sprintf и sscanf (см. Приложение №1) возможна "эмуляция потокового вывода" информации в строку текста, откуда её можно вывести средствами API системных библиотек ввода-вывода (таких как Windows API, GTK+, Qt и др.).
В качестве "стандартных потоков", присутствующих в операционной системе всегда и никогда не удаляемых из оперативной памяти, используются следующие потоки (см. таблицу 6.1):
stdin, cin и др.) - используется для ввода символьных данных в программу. По-умолчанию этот поток закреплён за клавиатурой компьютера;stdout, cout и др.) - используется для вывода символьной информации, полученной в результате работы программы в "штатном режиме". По-умолчанию этот поток закреплён за экраном дисплея;stderr, cerr и др.) - используется для вывода символьных Примечание: стандартный поток и поток ошибок разделены в связи с тем, что при
stdprn и др.) - используется для вывода результатов работы программы на печать. По-умолчанию этот поток закреплён за текущим принтером в системе, подключённым к порту Все остальные потоки создаются или уничтожаются с помощью функций открытия и закрытия файлов, на период чтения/записи/добавления информации в эти файлы.
Ввод со стандартного потока в Си осуществляется при помощи следующих функций:
getchar ;gets ;scanf ;С синтаксисом и правилами использования этих функций можно ознакомиться в приложении №I к данной лекции. Автор хочет отметить, что использование функций ввода со стандартного потока является небезопасным, а, следовательно, и нежелательным способом ввода данных из стандартного потока. По возможности, заменяйте эти функции функциями потокового чтения данных с "явным" указанием потоков и "длины" прочтённой строки.
Пример 6.1
/* Файл ex06001.c */
/* Функция иллюстрирует потоковый ввод-вывод (как это делать нельзя)*/
#include <stdio.h>
#define STR_LENGTH 3 // Длина строки 3 символа
void main()
{
char str[STR_LENGTH]; // Текстовый буфер
char *s; // Временная переменна
s = gets( str );
puts( s );
}
Например, функция, приведённая в примере 6.1, при вводе строки: "aaaaaaaa\n", - вызовет аварийное завершение с ошибкой "переполнение буфера". Поскольку длина текстового буфера - 2 символа (последний символ - "нулевой", знак окончания строки '\0' ), то лишние символы, введённые с клавиатуры, попадают в "запредельную"
Пример 6.2
/* Файл ex06002.c */
/* Функция иллюстрирует потоковый ввод-вывод (как это делать надо)*/
/* Пример тестировался в системе программировани
Borland C/C++ 3.10 */
#include <stdio.h>
#include <conio.h>
#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()) ); // Цикл пока не нажата клавиша
}
Пример 6.3
/* Файл ex06003.c */
/* Функция иллюстрирует потоковый ввод-вывод (как это делать надо)*/
/* Пример тестировался в системе программировани
Borland C/C++ 3.10 */
#include <stdio.h>
#include <conio.h>
#include <string.h>
#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()) ); // Цикл пока не нажата клавиша
}
Консольный потоковый ввод в языке C++ осуществляется при помощи операторов ">>", а также при помощи функций get, и ignore. cin (см. таблицу 6.1).
| Обозначения потоков | |||||
|---|---|---|---|---|---|
| Поток | Ввод (стандартный) | Вывод (стандартный) | Вывод ошибок | Передача на линию | Печать |
| Значение дескриптора | 0 | 1 | 2 | 3 | 4 |
| Обозначение в Си | stdin |
stdout |
stderr |
stdaux |
stdprn |
| Обозначение в C++ | cin |
cout |
cerr |
нет | нет |
| Обозначение в Java | System.in |
System.out |
? | нет | нет |
| Обозначение в Perl | STDIN |
STDOUT |
STDERR |
нет | нет |
| Обозначение в Python | sys.stdin |
sys.stdout |
sys.stderr |
нет | нет |
| Обозначение в VBScript | StdIn |
StdOut |
StdErr |
нет | нет |
Описание функций для потокового ввода средствами языка C++ смотри в приложении №III к данной лекции.
C помощью оператора ">>" можно осуществить как неформатированный, так и форматированный ввод-вывод. Однако автор советует для ввода использовать неформатированный ввод из потока с помощью функции cin.get, а затем "выделить и ввести" нужные двоичные значения при помощи функции sscanf (см. пример 6.4.).
Пример 06.004.
/* File ex06004.cpp */
/* Пример ввода-вывода средствами C++*/
/* Пример тестировался в системе программировани
Borland C/C++ 3.10 */
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#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()) ); // Цикл пока не нажата клавиша
}
В этом примере для ввода символьной строки использовалась функция cin.get, для вывода - оператор "<<", а для форматных преобразований - функции sprintf и sscanf.
Описание функций sscanf и sprintf см. в приложении №I к данной лекции.
Замечание: из личного опыта автора родился следующий совет: при работе с консолью, когда не требуется программирование фильтров и sprintf и sscanf, предварительно проверив (т.н. "валидация") формат читаемых и записываемых символов. Во всех случаях нужно жёстко контролировать итоговую длину строки ввода-вывода.
Ввод данных с клавиатуры в Quick Basic осуществляется при помощи оператора INPUT, о котором подробно было сказано в лекции, посвящённой консольному вводу-выводу. Форматы этого оператора следующие:
| ОПЕРАТОР: | INPUT |
| НАЗНАЧЕНИЕ: | Форматированный ввод переменных; |
| СИНТАКСИС: | INPUT [;] ["prompt"{; | ,}] < |
| ОПИСАНИЕ: | Оператор осуществляет форматированный ввод значений переменных, перечисленных в строке <"prompt" используется для вывода приглашения на ввод данных. Она представляет собой допустимую строку на Бейсике; |
| ПРИМЕЧАНИЕ: | INPUT использует запятую как разделитель между именами переменных; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
| ОПЕРАТОР: | LINE INPUT |
| НАЗНАЧЕНИЕ: | Не форматированный ввод строки в символьную переменную. |
| СИНТАКСИС: | LINE INPUT [;] ["prompt";] <символьная переменная>$ |
| ОПИСАНИЕ: | Оператор осуществляет неформатированный ввод строки в указанную переменную. В качестве значений допускаются любые символы. Строка "prompt" используется для вывода приглашения на ввод данных. Она представляет собой допустимую строку на Бейсике; |
| ПРИМЕЧАНИЕ: | LINE INPUT читает все символы до нажатия пользователем клавиши "Enter" ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
Строка "prompt" представляет собой строку текста приглашения, предваряющую ввод данных.
Пример 6.5.
REM FILE EX06005.BAS REM ФАЙЛ ПРИМЕРА ТЕСТИРОВАЛСЯ В СИСТЕМЕ ПРОГРАММИРОВАНИЯ REM QUICK BASIC ОПЕРАЦИОННОЙ СИСТЕМЫ MICROSOFT WINDOWS 98 REM 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
Для чтения из файла или <> ), которой в качестве операнда передаётся STDIN (см. таблицу 6.1). Рассмотрим ввод этими средствами поподробнее:
Основное предназначение операции - прочитать одну строку или все строки файла, дескриптор которого представляет собой операнд этой операции. Синтаксис этой операции следующий:
$"переменная" = <"дескриптор">
или
@"переменная" = <"дескриптор">
В этих синтаксических конструкциях значение (операнд) "дескриптор" для оператора ввода с клавиатуры опускается или заменяется ключевым словом STDIN.
В первой конструкции в скалярную переменную записывается одна (очередная) строка из файла либо со " ). Во второй конструкции читаются все (оставшиеся) строки из файла.
Особо отметим, что операция <> без операнда при первом своём появлении проверяет, пуст ли массив операндов программы @ARGV. Если он пуст, то программа переходит в <STDIN>. Если же этот массив не пуст, то программа трактует каждый параметр в строке как имя файла и считает, что строки этих файлов есть то, что пользователь вводит на стандартном устройстве ввода.
Например, программа из примера 6.6 выводит на экран все строки файлов, перечисленные после него.
Пример 6.6
#!perl -w
# Файл ex06006.pl выводит в стандартный
# поток вывода все строки файлов, перечисленных
# после него
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
while( $line = <> )
{
print $line;
}
print STDERR "\nPress key Enter to Exit..";
$junk = <STDIN>
Так, конструкция [6.3] просто распечатывает самого себя (файл).
perl ex06006.pl ex06006.pl
Приведём ещё примеры ввода-вывода стандартными средствами языка Perl:
Пример 6.7
#!perl -w # File ex06007.pl # Реализация примера 06.004 на языке Perl # # Пример тестировался на компиляторе ActiveState # Perl 5.8.0 # print "\nВведите число: "; $ivalue = <STDIN>; print "\nВведённое значение: $ivalue"; # Завершение работы print STDERR "\nPress key Enter to Exit..."; $junk = <STDIN>; # Конец файла
Пример 6.8
#!perl -w
# File ex06008.pl
# Проверка на наличие ключей, переданных программе
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
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 = <STDIN>;
# Конец файла
При вычислении условий цикла while осуществляется присвоение переменной "$_" значения первого элемента массива @ARGV, и проверка наличия дефиса (-) в качестве первого символа (оператор /^-/ ). Далее оператор if проверяет содержимое переменной $_ на соответствие известным опциям. Функция shift удаляет из массива @ARGV первое значение, сдвигая оставшиеся в нём элементы влево.
Заключённая в обратные апострофы (`) строка или выражение, находящееся внутри записи операции "qx{…}", вызывает выполнение команды операционной системы. Когда интерпретатор Perl встречает строковый литерал в обратных апострофах, то, после подстановки значений скалярных переменных и элементов массива, интерпретатор передаёт получившуюся строку как команду на выполнение операционной системе.
Операция заключения строки символов в обратные апострофы различает скалярный и списковый контексты. В скалярном контексте возвращается одна строка, содержащая в себе весь вывод на экран монитора, включая псевдосимволы ". В списковом контексте возвращается список значений. Каждый элемент списка содержит одну строку вывода выполненной команды операционной системы.
В списковом контексте разбиение вывода команды операционной системы на элементы списка выполняется в соответствии со значением переменной "$/", являющимся разделителем. По-умолчанию это значение - "\n" (". Если этой переменной присвоить другое значение, то будет использовано это значение для разбиения "вывода на строки". Этим разделителем может быть любая последовательность символов.
Приведём примеры выполнения операции ввода с использованием обратных апострофов.
Пример 6.9.
#!perl -w # File ex06009.pl # Пример тестировался на компиляторе ActiveState # Perl 5.8.0 # # Операция заключения в обратные кавычки # в скалярном и списковом контекстах. $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 = <STDIN>; # Конец файла
Пример 6.10.
#perl -w
#
# Программа для перевода имён файлов в MS WINDOWS в верхний регистр.
#
# Синтаксис:
# >perl ex06010.pl [аргументы…]
#
# где аргументы - имена файлов и каталогов
#
# ЗАМЕЧАНИЕ:
# Функция не переименовывает файлы и каталоги, в именах которых
# есть умляуты и кириллические символы
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
#
$oldFileName = shift() or die "\nNo arguments"; # Читаем первый параметр скрипта
while( 1 )
{
# Цикл ПОКА есть параметры скрипта в командной строке
#
$newFileName = uc( $oldFileName); # Все символы в имени - в верхний регистр!
qx{ren $oldFileName $newFileName}; # Переименование файла
$oldFileNane = shift() or die"\nThe End of a script"; # Читаем следующий параметр скрипта или выход
}
# Конец процедуры
Пример 6.11.
#perl -w
#
# Программа для перевода имён файлов в MS WINDOWS в нижний регистр.
#
# Синтаксис:
# >perl ex06011.pl [аргументы…]
#
# где аргументы - имена файлов и каталогов
#
# ЗАМЕЧАНИЕ:
# Функция не переименовывает файлы и каталоги, в именах которых
# есть умляуты и кириллические символы
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
#
$oldFileName = shift() or die "\nNo arguments"; # Читаем первый параметр скрипта
while( 1 )
{
# Цикл ПОКА есть параметры скрипта в командной строке
#
$newFileName = lc( $oldFileName); # Все символы в имени - в нижний регистр!
qx{ren $oldFileName $newFileName}; # Переименование файла
$oldFileNane = shift() or die"\nThe End of a script"; # Читаем следующий параметр скрипта или выход
}
# Конец процедуры
Ещё одно применение операции "ромб" состоит в получении имён файлов определённого каталога, удовлетворяющему заданному шаблону. В скалярном контексте "ромб" возвращает первое найденное имя файла в текущем каталоге, в списковом контексте - список имён всех файлов,
Пример иллюстрирует печать имён всех файлов с расширением "*.pl"
Пример 6.12.
#!perl -w
# File ex06012.pl
# печать имён всех файлов с расширением "*.pl"
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
while ( $file = <*.pl> )
{
print "$file\n";
}
# Завершение работы
print STDERR "\nPress key Enter to Exit...";
$junk = <STDIN>;
# Конец файла
Для ввода строки символов с клавиатуры используется встроенная функция raw_input. Её описание смотри ниже.
| ФУНКЦИЯ | RAW_INPUT |
| ОПРЕДЕЛЕНА В: | Встроенная функция |
| СИНТАКСИС: | value = raw_input([prompt]), гдеvalue - вводимая строка текста;prompt - необязательная подсказка для ввода текста; |
| НАЗНАЧЕНИЕ: | Ввод строки символов с клавиатуры; |
| ОПИСАНИЕ: | Функция вводит с клавиатуры строку до символа перевода строки. Если при вводе встречается символ конца файла "EOF", то возбуждается исключение EOFError. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Введённая строка символов. |
| ФУНКЦИЯ | INPUT |
| ОПРЕДЕЛЕНА В: | Встроенная функция; |
| СИНТАКСИС: | input([prompt]), где prompt - необязательная подсказка для ввода текста; |
| НАЗНАЧЕНИЕ: | Ввод с клавиатуры строки кода Питона; |
| ОПИСАНИЕ: | Функция вводит с клавиатуры код Питона, что эквивалентно вызовам функций eval(raw_input()). Функция не защищена от ошибок пользователя, и вызывает исключение SyntaxError при ошибке синтаксиса. В-общем функция используется для быстрого ввода кода. В любых других случаях лучше использовать функцию raw_input() ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
Пример 6.13.
#! %PYTHON%/python # -*- coding: cp866 -*- # Пример тестировался на компиляторе ActiveState # Python 2.5. # # Файл 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...') # Конец программы
Пример 6.14.
#! %PYTHON%/python
# -*- coding: cp866 -*-
# Пример тестировался на компиляторе ActiveState
# Python 2.5.
#
# Файл 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 до символа перевода строки " (включая сам этот символ). Если строка состоит только из символа перевода строки, то метод readline возвращает пустую строку. Если в конце файла нет пустой строки с символом ", то возвращаемый результат не определён (этого допускать нельзя)! |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Введённая строка символов. В качестве дескриптора файла можно указать стандартный дескриптор |
| ФУНКЦИЯ | READLINES |
| ОПРЕДЕЛЕНА В: | Везде; |
| СИНТАКСИС: | value = f.readlines(["размер_строки"]), гдеvalue - переменная-список;f - "размер_строки" - необязательный параметр длины строки с текстом; |
| НАЗНАЧЕНИЕ: | Чтение всех строк файла в список; |
| ОПИСАНИЕ: | Функция читает все строки файла в переменную список. Если строка с текстом имеет меньшую длину, чем указанная в фактическом параметре "размер_строки", то файл читается дальше до достижения указанного числа символов. Метод чтения всех строк эффективен для чтения очень больших файлов построчно; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Список текстовых строк из всего файла; |
Для ввода символов с консоли в языке Turbo Prolog существуют следующие функции.
| ФУНКЦИЯ | readln |
| СИНТАКСИС: | readln(StringVariable), где StringVariable - переменная типа string, "возвращаемая". |
| НАЗНАЧЕНИЕ: | Данная функция считывает с консоли символы и записывает её в переменную StringVariable строкового типа. Строка считывается до первого символа ' ; |
| ШАБЛОНЫ: | (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(_) означает: "пока не нажата клавиша". |
Пример функции на языке Пролог для ввода числа (реализация алгоритма из примера 6.4).
Пример 6.15.
/* Файл ex06015.pro */ /* Пример тестировался в системе программировани Borland Turbo Prolog 2.0 */ domains /* Описываем переменные */ IValue = integer goal /* Выполняем функцию */ write( "\nВведите число: "), readint( IValue ),nl, writef( "\nВведённое число -- %d", IValue ), nl, write( "Press key Enter to Exit..." ), readchar( _ ).
Для ввода символов с консоли в языке VBScript существуют следующие функции.
| ФУНКЦИЯ | READ |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.Read(n), где n - число символов, которое необходимо прочесть; |
| НАЗНАЧЕНИЕ: | Чтение n символов из StdIn ; |
| ОПИСАНИЕ: | Функция считывает из потока StdIn заданное параметром n число символов и возвращает полученную строку; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Строка символов, прочтённая с клавиатуры; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
| ФУНКЦИЯ | READALL |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.ReadAll(); |
| НАЗНАЧЕНИЕ: | Читает все символы из потока StdIn ; |
| ОПИСАНИЕ: | Функция читает символы из потока StdIn до тех пор, пока не встретится символ конца файла "EOF" (ASCII 26, <Ctrl>+<Z>), и возвращает полученную строку; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Весь текст в одну строку; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
| ФУНКЦИЯ | READLINE |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.ReadLine(); |
| НАЗНАЧЕНИЕ: | Чтение строки символов из потока StdIn ; |
| ОПИСАНИЕ: | Функция читает символы из потока StdIn до тех пор, пока не встретится символ конца строки ", и возвращает полученную строку; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Возвращает строку, считанную из потока StdIn ; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
| ФУНКЦИЯ | SKIP |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.Skip(n), где n - число пропускаемых символов; |
| НАЗНАЧЕНИЕ: | Пропускает при чтении из потока StdIn заданное параметром n число символов; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
| ФУНКЦИЯ | SKIPLINE |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.SkipLine(); |
| НАЗНАЧЕНИЕ: | Пропускает целую строку при чтении из потока StdIn |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
Пример функции на языке Visual Basic Script для ввода числа (реализация алгоритма из примера 6.4).
Пример 6.16.
'***************************************************************** ' Имя: ex06016.vbs ' Язык: VBScript операционной системы Microsoft Windows XP ' Описание: Пример функции для чтения и вывода целого числа '***************************************************************** 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() '************* Конец ********************************************
Автор рекомендует для ввода данных с клавиатуры на языке Java использовать класс SavitchIn, описанный в Приложении №4 к данной лекции. Ниже приведён пример на языке Java реализации алгоритма из примера 6.4.
Пример 6.17.
/* File ex06017.java */
/* Пример тестировался на компиляторе Sun J2EE SDK 1.6 (Windows) */
/* Данный пример требует наличие компилированного класса 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();
}
}
На данной лекции Вы ознакомились с поточным (буферизированным) вводом-выводом, изучили функции потокового ввода на разных языках программирования, и научились писать программы с их использованием. На следующей лекции Вы закрепите материал по потоковому вводу-выводу, а затем узнаете о функциях открытия, закрытия и манипуляциями файлового буфера.
На данной лекции автор специально опускает материал, касающийся организации потокового ввода-вывода на языке Ассемблер, поскольку эти функции в нём реализованы не очевидно, и разбор их работы требует отдельного курса лекций.
В заключение отмечу, что при помощи функций буферизированного ввода-вывода очень легко писать программы - фильтры для работы в командной строке операционной системы. Именно функции потокового ввода-вывода являются "переносимыми между всеми платформами и операционными системами".
| ФУНКЦИЯ | SPRINTF |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int sprintf( buffer, format_string[, argument...]);char *buffer - символьная строка, в которую записывается результат вывода переменных, заданных параметрами argument, отформатированных с помощью строки форматов;const char *format_string - строка форматов для вывода аргументов; |
| НАЗНАЧЕНИЕ: | Вывод значений переменных в заданный буфер при помощи строки форматов; |
| ОПИСАНИЕ: | Функция sprintf форматирует и выводит последовательности символов и значений аргументов в buffer. Каждый аргумент преобразуется и выводится согласно соответствующей спецификации в строке, адрес которой задаётся значением параметра format_string. Строка описания printf. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Число символов, помещённых в строку, адрес которой задаётся значением параметра buffer. |
| ПЕРЕНОСИМОСТЬ: | Стандарт ANSI, работает во всех реализациях Си; |
| ФУНКЦИЯ | SSCANF |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int sscanf( buffer, format_string[, argument...]);const char *buffer - символьная строка, из которой считывается значения переменных, заданных параметрами argument и формируемых с помощью строки форматов;const char *format_string - строка форматов для ввода аргументов; |
| НАЗНАЧЕНИЕ: | Чтение значений переменных из заданного буфера при помощи строки форматов; |
| ОПИСАНИЕ: | Функция sscanf читает данные из символьного массива, адрес которого задаётся значением переменной buffer, в переменные, адреса которых задаются аргументами arguments. Каждый аргумент должен быть указателем на переменную с типом, соответствующему типу, определённому в строке описания формата, адрес которой задаётся значением параметра format_string. Строка описания формата управляет интерпретацией входных полей и имеет тот же вид, что и для функции scanf. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Число полей, которые были успешно преобразованы и присвоены. Возвращаемое значение не включает поля, которые были прочитаны, но не были присвоены. Значение EOF, если была попытка прочитать символ конца строки. Значение "0", если не было присвоенных полей. |
| ПЕРЕНОСИМОСТЬ: | Стандарт ANSI, работает во всех реализациях Си; |
| ФУНКЦИЯ | scanf |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int scanf( format_string[,argument…] ); char *format_string; |
| НАЗНАЧЕНИЕ: | Функция scanf читает данные из stdin в переменные, адреса которых задаются аргументами arguments. Функция имеет переменное число параметров; |
| ОПИСАНИЕ: | Значение параметра format_string задаёт адрес строки, которая управляет интерпретацией вводимых полей. Каждый последующий аргумент должен быть указателем на переменную типа, соответствующей типу, определённой в строке формата. Строка описания формата ввода может содержать:' ', '\t', '\n'. Если пробельный символ встретился в строке формата, то с этого момента пробельные символы считываются из потока ввода вплоть до первого символа, не являющимися пробельным, но не участвуют в присвоении значений (т.е. игнорируются);'%', эти символы считываются из потока и проверяются на соответствие символам строки формата. Если нет совпадения символов в строке и стандартном потоке, считывание символов прекращается, и функция возвращает ошибку;'%'. width. Лишние символы из входного потока игнорируются. При задании аргументов меньше, чем в строке формата, результат не определён; |
| ПРИМЕЧАНИЕ: | SCANF часто приводит к непредсказуемым результатам, когда Вы отклоняетесь от точного шаблона. Вам следует помнить, что нужно указывать функции scanf, каким образом синхронизировать конец строки. В результате бывает предпочтительней комбинация из вызовов функций fgets и sscanf последовательно друг за другом; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Число полей, которые были успешно преобразованы и присвоены. Возвращаемое значение не содержит полей, которые были прочитаны, но не присвоены;
0 - если не было присваивания полей; |
| ПЕРЕНОСИМОСТЬ: | Функция scanf поддерживается в операционных системах, основанных на UNIX, определена в стандарте ANSI C. Также функция определена в стандарте Кернигана и Ритчи. |
| ФУНКЦИЯ: | gets |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | char *gets( s ); char *s; |
| НАЗНАЧЕНИЕ: | Функция получает строку из потока; |
| ОПИСАНИЕ: | Функция gets читает строку символов, оканчивающуюся символом перевода строки, в переменную s из стандартного входного потока stdin. Данная символьная строка оканчивается символом перехода на новую строку, который при записи в s заменяется нулевым окончанием '\0' ; |
| ЗАМЕЧАНИЯ: | scanf, gets позволяет вводить строки, содержащие символы пробела и табуляции. Всё, что было введено до перевода каретки, помещается в s ;fgets ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | При успешном завершении функция gets возвращает строку s. При достижении конца файла (EOF) или ошибке возвращается NULL ; |
| ПЕРЕНОСИМОСТЬ: | Функция поддерживается на операционных системах, основанных на UNIX и стандартом ANSI C. |
| ФУНКЦИЯ: | getc |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int getc( stream ); FILE *stream; |
| НАЗНАЧЕНИЕ: | Функция вводит из потока символ; |
| ОПИСАНИЕ: | Функция getc представляет собой stream и увеличивает указатель текущего положения в потоке на единицу; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | При успешном завершении функция getc возвращает считанный символ после предварительного его преобразования в целый тип. При возникновении ситуации "конец файла" и при ошибке ввода она возвращает значение EOF; |
| ПЕРЕНОСИМОСТЬ: | Функция поддерживается в операционных системах UNIX, поддерживается стандартом ANSI C, и описана в стандарте Кернигана и Ритчи. |
| ФУНКЦИЯ: | getchar |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int getchar(); |
| НАЗНАЧЕНИЕ: | Функция вводит символ из потока stdin ; |
| ОПИСАНИЕ: | getchar - это макрокоманда, вводящая символ из потока stdin Она определена следующим образом: getc( stdin ) ; |
| ЗАМЕЧАНИЕ: | getchar читает символы с stdin, который имеет буфер на одну строку. Поэтому она ничего не возвращает до тех пор, пока вы не нажмёте Enter ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | При успешном завершении функция getchar возвращает считанный символ после предварительного преобразования его в целый тип. При ошибке оно возвращает значение EOF; |
| ПЕРЕНОСИМОСТЬ: | Функция поддерживается в операционных системах UNIX, стандартом ANSI C, и описана в стандарте Кернигана и Ритчи. |
Более подробное описание функций ввода на языке Си смотрите [3].
PRINTF
СИНТАКСИС: %[flags][width][.precision][F|N|h|l|L]type, где
flags - определяет выравнивание выводимых символов, управление печатью знаковых символов ('+' и '-'), пробелов, десятичных точек, восьмеричных и шестнадцатеричных префиксов. Значения полей см. в таблице 6.3;width - положительное целое десятичное число, определяющее минимальное число выводимых символов. Если число символов в выводном значении меньше, чем определено в width, то пробелы дополняются справа или слева (в зависимости от значения флага). Спецификация никогда не вызывает обрезание значащих символов в выводимом значении, всегда печатаются все символы. Обрезание значений возможно только при указании параметра: precision. Если в поле width спецификации стоит знак "звёздочка", то в этом случае сам текущий аргумент из списка аргументов (имеющий тип int ) предполагается как значение, задающее минимальное количество символов. Это значение задаётся переменной в списке аргументов, она должна предшествовать выводимому значению;precision - неотрицательное целое число, определяет точное число символов, которые должны быть напечатаны, или место десятичной точки. Позволяет сузить и округлить значение вещественных (не целых) чисел. Если в поле precision спецификации стоит знак "звёздочка", то в этом случае сам текущий аргумент из списка аргументов (имеющий тип int ) предполагается как значение, задающее минимальное количество символов. Это значение задаётся переменной в списке аргументов, она должна предшествовать выводимому значению. Смысл параметра precision приведён в таблице 6.4;F - префикс к аргументу, указывающий, что используется "дальний указатель" на память;N - префикс к аргументу, указывающий, что используется "ближний" указатель на память;l - указывает, что используется "длинная" ("long") разновидность типа данных (например, long int );h - указывает, что используется "короткая" ("short") разновидность данных (например, short int );type, который появляется после последнего поля формата, должен соответствовать типу выводимых значений переменной;
значение символа type указано в таблице 6.3;
| Спецификации формата функции scanf | ||
|---|---|---|
| Символ типа | Ожидаемый ввод | Тип аргумента |
| Числа | ||
| d | десятичное целое | указатель на целое (int *arg) |
| D | десятичное целое | указатель на длинное целое (long *arg) |
| o | восьмеричное целое | указатель на целое (int *arg) |
| O | восьмеричное целое | указатель на длинное целое (long *arg) |
| i | десятичное, восьмеричное или шестнадцатеричное целое | указатель на длинное целое (long *arg) |
| u | десятичное целое без знака | указатель на целое без знака (unsigned int *arg) |
| U | десятичное целое без знака | указатель на длинное целое без знака (unsigned long *arg) |
| x | шестнадцатеричное целое | указатель на целое (int *arg) |
| X | шестнадцатеричное целое | указатель на длинное целое (long *arg) |
| e | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| E | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| f | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| g | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| G | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| Символьные данные | ||
| s | строка символов | указатель на массив символов (char arg[]) |
| Примечание: | Размер массива должен быть по крайней мере (n+1) байтов, где n – длина строки s (в символах). Входное поле оканчивается пробелом или символом перехода на новую строку. К символьной строке автоматически добавляется нулевое окончание "\0" и записывается как последний элемент массива. В принципе, использовать такой способ ввода символьных знаков опасно: лучше использовать связку функций: fgets + sscanf. |
|
| c | символ | указатель на символ (char *arg); если ширина поля w задаётся вместе с символом типа c (как например: %5c) – указатель на массив из w символов (char arg[w]); |
| % | символ % | Никакого преобразования не происходит; символ % читается, но не сохраняется. |
| Указатели | ||
| n | отсутствует | указатель на целое (int *arg). Данный указатель хранит количество считанных символов до %n. |
| p | шестнадцатеричное число в форме YYYY:ZZZZ или ZZZZ | указатель на данный объект (дальний или ближний). Преобразования %p предусматривают стандартный размер указателя, принятый в данной модели памяти. |
| Символ преобразования | ||
|---|---|---|
| Целые данные | ||
| d | целое | целое десятичное со знаком |
| i | целое | целое десятичное со знаком |
| o | целое | целое восьмеричное без знака |
| u | целое | целое десятичное без знака |
| x | целое | целое шестнадцатеричное без знака (с буквами a, b, c, d, e, f) |
| X | целое | целое шестнадцатеричное без знака (с буквами A, B, C, D, E, F). |
| f | с плавающей точкой | значение со знаком в форме [-]dddd.dddd |
| e | с плавающей точкой | значение со знаком в форме [-]d.dddde[+/-] |
| g | с плавающей точкой | значение со знаком либо в форме f, либо в форме e, с данным значением и точностью. Хвостовые нули и десятичная точка печатаются только при необходимости |
| E | с плавающей точкой | так же, как в случае e, только с буквой E для обозначения степени |
| G | с плавающей точкой | так же, как в случае g, только с буквой E для обозначения степени |
| Символьные данные | ||
| c | символьное | один символ |
| s | указатель на строку | печатает символы до тех пор, пока не встретится нулевое окончание, либо не будет достигнута заданная длина строки. |
| % | нет символа | печатается только знак % |
| Указатели | ||
| n | указатель на целое | сохраняется (по адресу, указанному во |
| p | указатель | печатает входной элемент как указатель; дальние указатели печатаются, как XXXX:YYYY, ближние указатели печатаются, как YYYY (только смещение). |
| Соглашения | ||
| e или E | аргумент преобразуется в соответствии с шаблоном: [-]d. |
|
| f | аргумент преобразуется в десятичную форму в соответствии с шаблоном [-] |
|
| g или G | аргумент печатается по принципу e, E или f, с точностью, обозначающей число значащих цифр. Хвостовые нули удаляются, десятичная точка ставится только при необходимости. Аргумент печатается по принципу e или f (c некоторыми ограничениями), если символ преобразования g, и по принципу E или f, если указан символ преобразования G. Данные печатаются только в научном формате, если экспонента, полученная в результате либо a) больше, чем точность, либо b) меньше, чем -4. | |
| Замечание. Неопределённые значения (бесконечность) печатаются как +INF и -INF, Не числа IEEE печатаются как + |
||
| Флаги функции printf и их интерпретация | |
|---|---|
| Флаг | Что означает |
| - | Левое выравнивание результата, пробелы остаются справа. Если флаг не задан, результат выравнивается справа, заполняется пробелами или нулями слева. |
| + | Знаковое преобразование: результат всегда начинается со знака '+' или '-'. |
| пусто | Если значение не отрицательно, вывод начинается с пробела вместо плюса; отрицательные значения всегда начинаются со знака минус. |
| # | Специфицирует, что преобразуемый аргумент используется в "альтернативной" форме. Смотри таблицу ниже. |
| Примечание: Знак плюс имеет приоритет над пробелом в обоих случаях. | |
| Символ преобразования | Как # влияет на результат |
| c, s, d, i, u | Не оказывает влияния. |
| x или X | 0x (или 0X)предшествует значению аргумента. |
| e, E, или f | Результат всегда будет содержать десятичную точку, даже если за точкой не следует никаких цифр. Обычно десятичная точка появляется в результате, если за точкой следует цифра. |
| g или G | Аналогично e или E, с дополнением, что хвостовые нули не удаляются. |
SCANF
СИНТАКСИС: %[*][width][F|N][h|l|L]type, где
width - положительное десятичное целое число, определяющее максимальное число символов, которые будут прочитаны из потока stdin согласно спецификации аргумента. Не более чем width считываются и участвуют в присвоении значения, но если встречается пробельный символ или символ, не преобразуемый в указанном формате, ввод завершится раньше;F - префикс к аргументу, указывающий, что используется "дальний указатель" на память;N - префикс к аргументу, указывающий, что используется "ближний" указатель на память;l - указывает, что используется "длинная" ("long") разновидность типа данных (например, long int );h - указывает, что используется "короткая" ("short") разновидность данных (например, short int );type указано в таблице 6.2.Описание строки форматов функции 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 | Новая строка ( |
| \t | Горизонтальная табуляция; |
| \nnn | Символ с кодом nnn в текущей кодировке; |
Более подробное описание форматов функций printf и scanf языка Си смотрите [3], а функции writef языка Turbo Prolog - в [53].
Для потокового ввода-вывода данных (например, при чтении из стандартного потока или при записи в istream и ostream
| ОПЕРАТОР | << (вывода) |
| ОПРЕДЕЛЁН В: | <iostream.h> |
| СИНТАКСИС: | ostream << argument[ << arguments…]; |
| НАЗНАЧЕНИЕ: | Оператор осуществляет вывод в поток ostream аргументов; |
| ОПИСАНИЕ: | Оператор "<<" осуществляет вывод в поток ostream (которым может быть любой поток вывода), указанных после его знака аргументов. Порядок "вычисления" аргументов производится слева направо; |
| ПРИМЕЧАНИЕ: | В заголовочном файле определены операции вывода строки символов, целых, длинных целых значений и значений с плавающей точкой двойной точности. При выводе других значений необходимо "явное" приведение типов; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток ostream, в который был произведён вывод; |
| ОПЕРАТОР | >> (ввода) |
| ОПРЕДЕЛЁН В: | <iostream.h> |
| СИНТАКСИС: | istream >> argument[ >> arguments…]; |
| НАЗНАЧЕНИЕ: | Оператор осуществляет ввод аргументов из потока istream ; |
| ОПИСАНИЕ: | Оператор ">>" осуществляет ввод из входного потока istream (которым может быть любой поток ввода), указанных после его знака аргументов. Порядок ввода элементов из потока - слева направо. Вводимые значения должны соответствовать объявленному типу и должны разделяться пробелом (пробелами); |
| ПРИМЕЧАНИЕ: | В заголовочном файле оператора определены операции ввода строки символов, одинокого символа, короткого целого, целого и длинного целого числа, чисел с плавающей точкой пониженной и удвоенной разрядности. При выводе других значений необходимо "явное" приведение типов. Оператор не вводит пробельных символов; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток istream, из которого был произведён ввод; |
| ФУНКЦИЯ | istream.get |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | istream.get( ch ); char ch; |
| НАЗНАЧЕНИЕ: | Функция ввода одиночного символа; |
| ОПИСАНИЕ: | Указанная функция просто читает один символ и помещает его в свой аргумент. Функция может читать любые символы, в том числе "пробельные" и "двоичные"; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток istream, из которого был произведён ввод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .get, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore. |
| ФУНКЦИЯ | istream.get |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | istream.get( p, n, z='\n' ); char *p; int n; int z; |
| НАЗНАЧЕНИЕ: | Функция чтения из потока строки символов; |
| ОПИСАНИЕ: | Указанная функция читает и размещает по адресу, заданному первым аргументом, не более символов, заданных вторым аргументом. По-умолчанию функция get прочтёт не более чем n символов и не более чем одну строку. Последнее ограничение определяется третьим аргументом - он задаёт символ ограничитель строки, который в операционных системах по-умолчанию является '\n'. Функция позволяет вводить пробельные символы; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток istream, из которого был произведён ввод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .get, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore ; |
| ФУНКЦИЯ | istream. |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | char istream. |
| НАЗНАЧЕНИЕ: | Функция возвращает следующий символ из потока; |
| ОПИСАНИЕ: | Указанная функция возвращает следующий символ из потока, но не удаляет его из потока; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Прочитанный символ или EOF, если достигнут конец потока или произошла ошибка ввода данных; |
| ФУНКЦИЯ | istream.ignore |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | istream.ignore( Limit = 1, Delim = EOF ); int Limit; int Delim; |
| НАЗНАЧЕНИЕ: | Функция пропускает заданное количество символов; |
| ОПИСАНИЕ: | Указанная функция пропускает заданное количество символов (по умолчанию - 1) и останавливается, если встречает символ Delim. По-умолчанию, если не заданы никакие аргументы, функция .ignore() пропускает один символ и останавливается, если встречает конец файла; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток istream, из которого был произведён ввод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .ignore, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore ; |
| ФУНКЦИЯ | ostream.put |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | ostream.put( ch ); char ch; |
| НАЗНАЧЕНИЕ: | Функция выводит одиночный символ; |
| ОПИСАНИЕ: | Указанная функция выводит одиночный символ в поток ostream (которым может быть любой поток вывода). Функция может вывести даже "двоичный символ"; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток ostream, куда был произведён вывод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .put, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .put и .write ; |
| ФУНКЦИЯ | ostream.write |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | ostream.write( buf, n); const char *buf; int n; |
| НАЗНАЧЕНИЕ: | Функция выводит буфер buf ; |
| ОПИСАНИЕ: | Указанная функция выводит в поток ostream (которым может любой выходной поток) не более чем n символов из буферной строки buf. При этом буфер может содержать не только текстовые, но и двоичные данные! |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток ostream, куда был произведён вывод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .write, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .put и .write ; |
Дополнительную информацию о функциях и операторах потокового ввода-вывода данных в C++ смотри [10, 30]
Класс, обеспечивающий ввод данных с консольного устройства. Данный класс был разработан автором [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) смотри в архиве примеров к данному курсу или приведённой выше ссылки Интернета.
В операционных системах корпорации Microsoft (начиная с версии MS-DOS 2.0) и всех "клонах" UNIX существует возможность "потокового ввода-вывода" данных, например, на консоль, на принтер или в файл.
Принцип "потокового ввода-вывода" следующий:
В буфер заносятся только символьные данные. Как следствие, при потоковом выводе нельзя (или "практически нельзя") изменить атрибуты выводимых символов, их шрифтовое и абзацное оформление и т.д. Кроме того, в стандартные
Вследствие вышесказанного автор просто обязан рассказать о технологии потокового ввода-вывода. Тем более что при помощи функций sprintf и sscanf (см. Приложение №1) возможна "эмуляция потокового вывода" информации в строку текста, откуда её можно вывести средствами API системных библиотек ввода-вывода (таких как Windows API, GTK+, Qt и др.).
В качестве "стандартных потоков", присутствующих в операционной системе всегда и никогда не удаляемых из оперативной памяти, используются следующие потоки (см. таблицу 6.1):
stdin, cin и др.) - используется для ввода символьных данных в программу. По-умолчанию этот поток закреплён за клавиатурой компьютера;stdout, cout и др.) - используется для вывода символьной информации, полученной в результате работы программы в "штатном режиме". По-умолчанию этот поток закреплён за экраном дисплея;stderr, cerr и др.) - используется для вывода символьных Примечание: стандартный поток и поток ошибок разделены в связи с тем, что при
stdprn и др.) - используется для вывода результатов работы программы на печать. По-умолчанию этот поток закреплён за текущим принтером в системе, подключённым к порту Все остальные потоки создаются или уничтожаются с помощью функций открытия и закрытия файлов, на период чтения/записи/добавления информации в эти файлы.
Ввод со стандартного потока в Си осуществляется при помощи следующих функций:
getchar ;gets ;scanf ;С синтаксисом и правилами использования этих функций можно ознакомиться в приложении №I к данной лекции. Автор хочет отметить, что использование функций ввода со стандартного потока является небезопасным, а, следовательно, и нежелательным способом ввода данных из стандартного потока. По возможности, заменяйте эти функции функциями потокового чтения данных с "явным" указанием потоков и "длины" прочтённой строки.
Пример 6.1
/* Файл ex06001.c */
/* Функция иллюстрирует потоковый ввод-вывод (как это делать нельзя)*/
#include <stdio.h>
#define STR_LENGTH 3 // Длина строки 3 символа
void main()
{
char str[STR_LENGTH]; // Текстовый буфер
char *s; // Временная переменна
s = gets( str );
puts( s );
}
Например, функция, приведённая в примере 6.1, при вводе строки: "aaaaaaaa\n", - вызовет аварийное завершение с ошибкой "переполнение буфера". Поскольку длина текстового буфера - 2 символа (последний символ - "нулевой", знак окончания строки '\0' ), то лишние символы, введённые с клавиатуры, попадают в "запредельную"
Пример 6.2
/* Файл ex06002.c */
/* Функция иллюстрирует потоковый ввод-вывод (как это делать надо)*/
/* Пример тестировался в системе программировани
Borland C/C++ 3.10 */
#include <stdio.h>
#include <conio.h>
#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()) ); // Цикл пока не нажата клавиша
}
Пример 6.3
/* Файл ex06003.c */
/* Функция иллюстрирует потоковый ввод-вывод (как это делать надо)*/
/* Пример тестировался в системе программировани
Borland C/C++ 3.10 */
#include <stdio.h>
#include <conio.h>
#include <string.h>
#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()) ); // Цикл пока не нажата клавиша
}
Консольный потоковый ввод в языке C++ осуществляется при помощи операторов ">>", а также при помощи функций get, и ignore. cin (см. таблицу 6.1).
| Обозначения потоков | |||||
|---|---|---|---|---|---|
| Поток | Ввод (стандартный) | Вывод (стандартный) | Вывод ошибок | Передача на линию | Печать |
| Значение дескриптора | 0 | 1 | 2 | 3 | 4 |
| Обозначение в Си | stdin |
stdout |
stderr |
stdaux |
stdprn |
| Обозначение в C++ | cin |
cout |
cerr |
нет | нет |
| Обозначение в Java | System.in |
System.out |
? | нет | нет |
| Обозначение в Perl | STDIN |
STDOUT |
STDERR |
нет | нет |
| Обозначение в Python | sys.stdin |
sys.stdout |
sys.stderr |
нет | нет |
| Обозначение в VBScript | StdIn |
StdOut |
StdErr |
нет | нет |
Описание функций для потокового ввода средствами языка C++ смотри в приложении №III к данной лекции.
C помощью оператора ">>" можно осуществить как неформатированный, так и форматированный ввод-вывод. Однако автор советует для ввода использовать неформатированный ввод из потока с помощью функции cin.get, а затем "выделить и ввести" нужные двоичные значения при помощи функции sscanf (см. пример 6.4.).
Пример 06.004.
/* File ex06004.cpp */
/* Пример ввода-вывода средствами C++*/
/* Пример тестировался в системе программировани
Borland C/C++ 3.10 */
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#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()) ); // Цикл пока не нажата клавиша
}
В этом примере для ввода символьной строки использовалась функция cin.get, для вывода - оператор "<<", а для форматных преобразований - функции sprintf и sscanf.
Описание функций sscanf и sprintf см. в приложении №I к данной лекции.
Замечание: из личного опыта автора родился следующий совет: при работе с консолью, когда не требуется программирование фильтров и sprintf и sscanf, предварительно проверив (т.н. "валидация") формат читаемых и записываемых символов. Во всех случаях нужно жёстко контролировать итоговую длину строки ввода-вывода.
Ввод данных с клавиатуры в Quick Basic осуществляется при помощи оператора INPUT, о котором подробно было сказано в лекции, посвящённой консольному вводу-выводу. Форматы этого оператора следующие:
| ОПЕРАТОР: | INPUT |
| НАЗНАЧЕНИЕ: | Форматированный ввод переменных; |
| СИНТАКСИС: | INPUT [;] ["prompt"{; | ,}] < |
| ОПИСАНИЕ: | Оператор осуществляет форматированный ввод значений переменных, перечисленных в строке <"prompt" используется для вывода приглашения на ввод данных. Она представляет собой допустимую строку на Бейсике; |
| ПРИМЕЧАНИЕ: | INPUT использует запятую как разделитель между именами переменных; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
| ОПЕРАТОР: | LINE INPUT |
| НАЗНАЧЕНИЕ: | Не форматированный ввод строки в символьную переменную. |
| СИНТАКСИС: | LINE INPUT [;] ["prompt";] <символьная переменная>$ |
| ОПИСАНИЕ: | Оператор осуществляет неформатированный ввод строки в указанную переменную. В качестве значений допускаются любые символы. Строка "prompt" используется для вывода приглашения на ввод данных. Она представляет собой допустимую строку на Бейсике; |
| ПРИМЕЧАНИЕ: | LINE INPUT читает все символы до нажатия пользователем клавиши "Enter" ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
Строка "prompt" представляет собой строку текста приглашения, предваряющую ввод данных.
Пример 6.5.
REM FILE EX06005.BAS REM ФАЙЛ ПРИМЕРА ТЕСТИРОВАЛСЯ В СИСТЕМЕ ПРОГРАММИРОВАНИЯ REM QUICK BASIC ОПЕРАЦИОННОЙ СИСТЕМЫ MICROSOFT WINDOWS 98 REM 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
Для чтения из файла или <> ), которой в качестве операнда передаётся STDIN (см. таблицу 6.1). Рассмотрим ввод этими средствами поподробнее:
Основное предназначение операции - прочитать одну строку или все строки файла, дескриптор которого представляет собой операнд этой операции. Синтаксис этой операции следующий:
$"переменная" = <"дескриптор">
или
@"переменная" = <"дескриптор">
В этих синтаксических конструкциях значение (операнд) "дескриптор" для оператора ввода с клавиатуры опускается или заменяется ключевым словом STDIN.
В первой конструкции в скалярную переменную записывается одна (очередная) строка из файла либо со " ). Во второй конструкции читаются все (оставшиеся) строки из файла.
Особо отметим, что операция <> без операнда при первом своём появлении проверяет, пуст ли массив операндов программы @ARGV. Если он пуст, то программа переходит в <STDIN>. Если же этот массив не пуст, то программа трактует каждый параметр в строке как имя файла и считает, что строки этих файлов есть то, что пользователь вводит на стандартном устройстве ввода.
Например, программа из примера 6.6 выводит на экран все строки файлов, перечисленные после него.
Пример 6.6
#!perl -w
# Файл ex06006.pl выводит в стандартный
# поток вывода все строки файлов, перечисленных
# после него
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
while( $line = <> )
{
print $line;
}
print STDERR "\nPress key Enter to Exit..";
$junk = <STDIN>
Так, конструкция [6.3] просто распечатывает самого себя (файл).
perl ex06006.pl ex06006.pl
Приведём ещё примеры ввода-вывода стандартными средствами языка Perl:
Пример 6.7
#!perl -w # File ex06007.pl # Реализация примера 06.004 на языке Perl # # Пример тестировался на компиляторе ActiveState # Perl 5.8.0 # print "\nВведите число: "; $ivalue = <STDIN>; print "\nВведённое значение: $ivalue"; # Завершение работы print STDERR "\nPress key Enter to Exit..."; $junk = <STDIN>; # Конец файла
Пример 6.8
#!perl -w
# File ex06008.pl
# Проверка на наличие ключей, переданных программе
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
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 = <STDIN>;
# Конец файла
При вычислении условий цикла while осуществляется присвоение переменной "$_" значения первого элемента массива @ARGV, и проверка наличия дефиса (-) в качестве первого символа (оператор /^-/ ). Далее оператор if проверяет содержимое переменной $_ на соответствие известным опциям. Функция shift удаляет из массива @ARGV первое значение, сдвигая оставшиеся в нём элементы влево.
Заключённая в обратные апострофы (`) строка или выражение, находящееся внутри записи операции "qx{…}", вызывает выполнение команды операционной системы. Когда интерпретатор Perl встречает строковый литерал в обратных апострофах, то, после подстановки значений скалярных переменных и элементов массива, интерпретатор передаёт получившуюся строку как команду на выполнение операционной системе.
Операция заключения строки символов в обратные апострофы различает скалярный и списковый контексты. В скалярном контексте возвращается одна строка, содержащая в себе весь вывод на экран монитора, включая псевдосимволы ". В списковом контексте возвращается список значений. Каждый элемент списка содержит одну строку вывода выполненной команды операционной системы.
В списковом контексте разбиение вывода команды операционной системы на элементы списка выполняется в соответствии со значением переменной "$/", являющимся разделителем. По-умолчанию это значение - "\n" (". Если этой переменной присвоить другое значение, то будет использовано это значение для разбиения "вывода на строки". Этим разделителем может быть любая последовательность символов.
Приведём примеры выполнения операции ввода с использованием обратных апострофов.
Пример 6.9.
#!perl -w # File ex06009.pl # Пример тестировался на компиляторе ActiveState # Perl 5.8.0 # # Операция заключения в обратные кавычки # в скалярном и списковом контекстах. $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 = <STDIN>; # Конец файла
Пример 6.10.
#perl -w
#
# Программа для перевода имён файлов в MS WINDOWS в верхний регистр.
#
# Синтаксис:
# >perl ex06010.pl [аргументы…]
#
# где аргументы - имена файлов и каталогов
#
# ЗАМЕЧАНИЕ:
# Функция не переименовывает файлы и каталоги, в именах которых
# есть умляуты и кириллические символы
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
#
$oldFileName = shift() or die "\nNo arguments"; # Читаем первый параметр скрипта
while( 1 )
{
# Цикл ПОКА есть параметры скрипта в командной строке
#
$newFileName = uc( $oldFileName); # Все символы в имени - в верхний регистр!
qx{ren $oldFileName $newFileName}; # Переименование файла
$oldFileNane = shift() or die"\nThe End of a script"; # Читаем следующий параметр скрипта или выход
}
# Конец процедуры
Пример 6.11.
#perl -w
#
# Программа для перевода имён файлов в MS WINDOWS в нижний регистр.
#
# Синтаксис:
# >perl ex06011.pl [аргументы…]
#
# где аргументы - имена файлов и каталогов
#
# ЗАМЕЧАНИЕ:
# Функция не переименовывает файлы и каталоги, в именах которых
# есть умляуты и кириллические символы
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
#
$oldFileName = shift() or die "\nNo arguments"; # Читаем первый параметр скрипта
while( 1 )
{
# Цикл ПОКА есть параметры скрипта в командной строке
#
$newFileName = lc( $oldFileName); # Все символы в имени - в нижний регистр!
qx{ren $oldFileName $newFileName}; # Переименование файла
$oldFileNane = shift() or die"\nThe End of a script"; # Читаем следующий параметр скрипта или выход
}
# Конец процедуры
Ещё одно применение операции "ромб" состоит в получении имён файлов определённого каталога, удовлетворяющему заданному шаблону. В скалярном контексте "ромб" возвращает первое найденное имя файла в текущем каталоге, в списковом контексте - список имён всех файлов,
Пример иллюстрирует печать имён всех файлов с расширением "*.pl"
Пример 6.12.
#!perl -w
# File ex06012.pl
# печать имён всех файлов с расширением "*.pl"
#
# Пример тестировался на компиляторе ActiveState
# Perl 5.8.0
#
while ( $file = <*.pl> )
{
print "$file\n";
}
# Завершение работы
print STDERR "\nPress key Enter to Exit...";
$junk = <STDIN>;
# Конец файла
Для ввода строки символов с клавиатуры используется встроенная функция raw_input. Её описание смотри ниже.
| ФУНКЦИЯ | RAW_INPUT |
| ОПРЕДЕЛЕНА В: | Встроенная функция |
| СИНТАКСИС: | value = raw_input([prompt]), гдеvalue - вводимая строка текста;prompt - необязательная подсказка для ввода текста; |
| НАЗНАЧЕНИЕ: | Ввод строки символов с клавиатуры; |
| ОПИСАНИЕ: | Функция вводит с клавиатуры строку до символа перевода строки. Если при вводе встречается символ конца файла "EOF", то возбуждается исключение EOFError. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Введённая строка символов. |
| ФУНКЦИЯ | INPUT |
| ОПРЕДЕЛЕНА В: | Встроенная функция; |
| СИНТАКСИС: | input([prompt]), где prompt - необязательная подсказка для ввода текста; |
| НАЗНАЧЕНИЕ: | Ввод с клавиатуры строки кода Питона; |
| ОПИСАНИЕ: | Функция вводит с клавиатуры код Питона, что эквивалентно вызовам функций eval(raw_input()). Функция не защищена от ошибок пользователя, и вызывает исключение SyntaxError при ошибке синтаксиса. В-общем функция используется для быстрого ввода кода. В любых других случаях лучше использовать функцию raw_input() ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
Пример 6.13.
#! %PYTHON%/python # -*- coding: cp866 -*- # Пример тестировался на компиляторе ActiveState # Python 2.5. # # Файл 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...') # Конец программы
Пример 6.14.
#! %PYTHON%/python
# -*- coding: cp866 -*-
# Пример тестировался на компиляторе ActiveState
# Python 2.5.
#
# Файл 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 до символа перевода строки " (включая сам этот символ). Если строка состоит только из символа перевода строки, то метод readline возвращает пустую строку. Если в конце файла нет пустой строки с символом ", то возвращаемый результат не определён (этого допускать нельзя)! |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Введённая строка символов. В качестве дескриптора файла можно указать стандартный дескриптор |
| ФУНКЦИЯ | READLINES |
| ОПРЕДЕЛЕНА В: | Везде; |
| СИНТАКСИС: | value = f.readlines(["размер_строки"]), гдеvalue - переменная-список;f - "размер_строки" - необязательный параметр длины строки с текстом; |
| НАЗНАЧЕНИЕ: | Чтение всех строк файла в список; |
| ОПИСАНИЕ: | Функция читает все строки файла в переменную список. Если строка с текстом имеет меньшую длину, чем указанная в фактическом параметре "размер_строки", то файл читается дальше до достижения указанного числа символов. Метод чтения всех строк эффективен для чтения очень больших файлов построчно; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Список текстовых строк из всего файла; |
Для ввода символов с консоли в языке Turbo Prolog существуют следующие функции.
| ФУНКЦИЯ | readln |
| СИНТАКСИС: | readln(StringVariable), где StringVariable - переменная типа string, "возвращаемая". |
| НАЗНАЧЕНИЕ: | Данная функция считывает с консоли символы и записывает её в переменную StringVariable строкового типа. Строка считывается до первого символа ' ; |
| ШАБЛОНЫ: | (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(_) означает: "пока не нажата клавиша". |
Пример функции на языке Пролог для ввода числа (реализация алгоритма из примера 6.4).
Пример 6.15.
/* Файл ex06015.pro */ /* Пример тестировался в системе программировани Borland Turbo Prolog 2.0 */ domains /* Описываем переменные */ IValue = integer goal /* Выполняем функцию */ write( "\nВведите число: "), readint( IValue ),nl, writef( "\nВведённое число -- %d", IValue ), nl, write( "Press key Enter to Exit..." ), readchar( _ ).
Для ввода символов с консоли в языке VBScript существуют следующие функции.
| ФУНКЦИЯ | READ |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.Read(n), где n - число символов, которое необходимо прочесть; |
| НАЗНАЧЕНИЕ: | Чтение n символов из StdIn ; |
| ОПИСАНИЕ: | Функция считывает из потока StdIn заданное параметром n число символов и возвращает полученную строку; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Строка символов, прочтённая с клавиатуры; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
| ФУНКЦИЯ | READALL |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.ReadAll(); |
| НАЗНАЧЕНИЕ: | Читает все символы из потока StdIn ; |
| ОПИСАНИЕ: | Функция читает символы из потока StdIn до тех пор, пока не встретится символ конца файла "EOF" (ASCII 26, <Ctrl>+<Z>), и возвращает полученную строку; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Весь текст в одну строку; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
| ФУНКЦИЯ | READLINE |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.ReadLine(); |
| НАЗНАЧЕНИЕ: | Чтение строки символов из потока StdIn ; |
| ОПИСАНИЕ: | Функция читает символы из потока StdIn до тех пор, пока не встретится символ конца строки ", и возвращает полученную строку; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Возвращает строку, считанную из потока StdIn ; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
| ФУНКЦИЯ | SKIP |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.Skip(n), где n - число пропускаемых символов; |
| НАЗНАЧЕНИЕ: | Пропускает при чтении из потока StdIn заданное параметром n число символов; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
| ФУНКЦИЯ | SKIPLINE |
| ОПРЕДЕЛЕНА В: | WScript; |
| СИНТАКСИС: | WScript.StdIn.SkipLine(); |
| НАЗНАЧЕНИЕ: | Пропускает целую строку при чтении из потока StdIn |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
| ПЕРЕНОСИМОСТЬ: | Только сценарии CScript; |
Пример функции на языке Visual Basic Script для ввода числа (реализация алгоритма из примера 6.4).
Пример 6.16.
'***************************************************************** ' Имя: ex06016.vbs ' Язык: VBScript операционной системы Microsoft Windows XP ' Описание: Пример функции для чтения и вывода целого числа '***************************************************************** 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() '************* Конец ********************************************
Автор рекомендует для ввода данных с клавиатуры на языке Java использовать класс SavitchIn, описанный в Приложении №4 к данной лекции. Ниже приведён пример на языке Java реализации алгоритма из примера 6.4.
Пример 6.17.
/* File ex06017.java */
/* Пример тестировался на компиляторе Sun J2EE SDK 1.6 (Windows) */
/* Данный пример требует наличие компилированного класса 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();
}
}
На данной лекции Вы ознакомились с поточным (буферизированным) вводом-выводом, изучили функции потокового ввода на разных языках программирования, и научились писать программы с их использованием. На следующей лекции Вы закрепите материал по потоковому вводу-выводу, а затем узнаете о функциях открытия, закрытия и манипуляциями файлового буфера.
На данной лекции автор специально опускает материал, касающийся организации потокового ввода-вывода на языке Ассемблер, поскольку эти функции в нём реализованы не очевидно, и разбор их работы требует отдельного курса лекций.
В заключение отмечу, что при помощи функций буферизированного ввода-вывода очень легко писать программы - фильтры для работы в командной строке операционной системы. Именно функции потокового ввода-вывода являются "переносимыми между всеми платформами и операционными системами".
| ФУНКЦИЯ | SPRINTF |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int sprintf( buffer, format_string[, argument...]);char *buffer - символьная строка, в которую записывается результат вывода переменных, заданных параметрами argument, отформатированных с помощью строки форматов;const char *format_string - строка форматов для вывода аргументов; |
| НАЗНАЧЕНИЕ: | Вывод значений переменных в заданный буфер при помощи строки форматов; |
| ОПИСАНИЕ: | Функция sprintf форматирует и выводит последовательности символов и значений аргументов в buffer. Каждый аргумент преобразуется и выводится согласно соответствующей спецификации в строке, адрес которой задаётся значением параметра format_string. Строка описания printf. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Число символов, помещённых в строку, адрес которой задаётся значением параметра buffer. |
| ПЕРЕНОСИМОСТЬ: | Стандарт ANSI, работает во всех реализациях Си; |
| ФУНКЦИЯ | SSCANF |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int sscanf( buffer, format_string[, argument...]);const char *buffer - символьная строка, из которой считывается значения переменных, заданных параметрами argument и формируемых с помощью строки форматов;const char *format_string - строка форматов для ввода аргументов; |
| НАЗНАЧЕНИЕ: | Чтение значений переменных из заданного буфера при помощи строки форматов; |
| ОПИСАНИЕ: | Функция sscanf читает данные из символьного массива, адрес которого задаётся значением переменной buffer, в переменные, адреса которых задаются аргументами arguments. Каждый аргумент должен быть указателем на переменную с типом, соответствующему типу, определённому в строке описания формата, адрес которой задаётся значением параметра format_string. Строка описания формата управляет интерпретацией входных полей и имеет тот же вид, что и для функции scanf. |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Число полей, которые были успешно преобразованы и присвоены. Возвращаемое значение не включает поля, которые были прочитаны, но не были присвоены. Значение EOF, если была попытка прочитать символ конца строки. Значение "0", если не было присвоенных полей. |
| ПЕРЕНОСИМОСТЬ: | Стандарт ANSI, работает во всех реализациях Си; |
| ФУНКЦИЯ | scanf |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int scanf( format_string[,argument…] ); char *format_string; |
| НАЗНАЧЕНИЕ: | Функция scanf читает данные из stdin в переменные, адреса которых задаются аргументами arguments. Функция имеет переменное число параметров; |
| ОПИСАНИЕ: | Значение параметра format_string задаёт адрес строки, которая управляет интерпретацией вводимых полей. Каждый последующий аргумент должен быть указателем на переменную типа, соответствующей типу, определённой в строке формата. Строка описания формата ввода может содержать:' ', '\t', '\n'. Если пробельный символ встретился в строке формата, то с этого момента пробельные символы считываются из потока ввода вплоть до первого символа, не являющимися пробельным, но не участвуют в присвоении значений (т.е. игнорируются);'%', эти символы считываются из потока и проверяются на соответствие символам строки формата. Если нет совпадения символов в строке и стандартном потоке, считывание символов прекращается, и функция возвращает ошибку;'%'. width. Лишние символы из входного потока игнорируются. При задании аргументов меньше, чем в строке формата, результат не определён; |
| ПРИМЕЧАНИЕ: | SCANF часто приводит к непредсказуемым результатам, когда Вы отклоняетесь от точного шаблона. Вам следует помнить, что нужно указывать функции scanf, каким образом синхронизировать конец строки. В результате бывает предпочтительней комбинация из вызовов функций fgets и sscanf последовательно друг за другом; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Число полей, которые были успешно преобразованы и присвоены. Возвращаемое значение не содержит полей, которые были прочитаны, но не присвоены;
0 - если не было присваивания полей; |
| ПЕРЕНОСИМОСТЬ: | Функция scanf поддерживается в операционных системах, основанных на UNIX, определена в стандарте ANSI C. Также функция определена в стандарте Кернигана и Ритчи. |
| ФУНКЦИЯ: | gets |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | char *gets( s ); char *s; |
| НАЗНАЧЕНИЕ: | Функция получает строку из потока; |
| ОПИСАНИЕ: | Функция gets читает строку символов, оканчивающуюся символом перевода строки, в переменную s из стандартного входного потока stdin. Данная символьная строка оканчивается символом перехода на новую строку, который при записи в s заменяется нулевым окончанием '\0' ; |
| ЗАМЕЧАНИЯ: | scanf, gets позволяет вводить строки, содержащие символы пробела и табуляции. Всё, что было введено до перевода каретки, помещается в s ;fgets ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | При успешном завершении функция gets возвращает строку s. При достижении конца файла (EOF) или ошибке возвращается NULL ; |
| ПЕРЕНОСИМОСТЬ: | Функция поддерживается на операционных системах, основанных на UNIX и стандартом ANSI C. |
| ФУНКЦИЯ: | getc |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int getc( stream ); FILE *stream; |
| НАЗНАЧЕНИЕ: | Функция вводит из потока символ; |
| ОПИСАНИЕ: | Функция getc представляет собой stream и увеличивает указатель текущего положения в потоке на единицу; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | При успешном завершении функция getc возвращает считанный символ после предварительного его преобразования в целый тип. При возникновении ситуации "конец файла" и при ошибке ввода она возвращает значение EOF; |
| ПЕРЕНОСИМОСТЬ: | Функция поддерживается в операционных системах UNIX, поддерживается стандартом ANSI C, и описана в стандарте Кернигана и Ритчи. |
| ФУНКЦИЯ: | getchar |
| ОПРЕДЕЛЕНА В: | <stdio.h> |
| СИНТАКСИС: | int getchar(); |
| НАЗНАЧЕНИЕ: | Функция вводит символ из потока stdin ; |
| ОПИСАНИЕ: | getchar - это макрокоманда, вводящая символ из потока stdin Она определена следующим образом: getc( stdin ) ; |
| ЗАМЕЧАНИЕ: | getchar читает символы с stdin, который имеет буфер на одну строку. Поэтому она ничего не возвращает до тех пор, пока вы не нажмёте Enter ; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | При успешном завершении функция getchar возвращает считанный символ после предварительного преобразования его в целый тип. При ошибке оно возвращает значение EOF; |
| ПЕРЕНОСИМОСТЬ: | Функция поддерживается в операционных системах UNIX, стандартом ANSI C, и описана в стандарте Кернигана и Ритчи. |
Более подробное описание функций ввода на языке Си смотрите [3].
PRINTF
СИНТАКСИС: %[flags][width][.precision][F|N|h|l|L]type, где
flags - определяет выравнивание выводимых символов, управление печатью знаковых символов ('+' и '-'), пробелов, десятичных точек, восьмеричных и шестнадцатеричных префиксов. Значения полей см. в таблице 6.3;width - положительное целое десятичное число, определяющее минимальное число выводимых символов. Если число символов в выводном значении меньше, чем определено в width, то пробелы дополняются справа или слева (в зависимости от значения флага). Спецификация никогда не вызывает обрезание значащих символов в выводимом значении, всегда печатаются все символы. Обрезание значений возможно только при указании параметра: precision. Если в поле width спецификации стоит знак "звёздочка", то в этом случае сам текущий аргумент из списка аргументов (имеющий тип int ) предполагается как значение, задающее минимальное количество символов. Это значение задаётся переменной в списке аргументов, она должна предшествовать выводимому значению;precision - неотрицательное целое число, определяет точное число символов, которые должны быть напечатаны, или место десятичной точки. Позволяет сузить и округлить значение вещественных (не целых) чисел. Если в поле precision спецификации стоит знак "звёздочка", то в этом случае сам текущий аргумент из списка аргументов (имеющий тип int ) предполагается как значение, задающее минимальное количество символов. Это значение задаётся переменной в списке аргументов, она должна предшествовать выводимому значению. Смысл параметра precision приведён в таблице 6.4;F - префикс к аргументу, указывающий, что используется "дальний указатель" на память;N - префикс к аргументу, указывающий, что используется "ближний" указатель на память;l - указывает, что используется "длинная" ("long") разновидность типа данных (например, long int );h - указывает, что используется "короткая" ("short") разновидность данных (например, short int );type, который появляется после последнего поля формата, должен соответствовать типу выводимых значений переменной;
значение символа type указано в таблице 6.3;
| Спецификации формата функции scanf | ||
|---|---|---|
| Символ типа | Ожидаемый ввод | Тип аргумента |
| Числа | ||
| d | десятичное целое | указатель на целое (int *arg) |
| D | десятичное целое | указатель на длинное целое (long *arg) |
| o | восьмеричное целое | указатель на целое (int *arg) |
| O | восьмеричное целое | указатель на длинное целое (long *arg) |
| i | десятичное, восьмеричное или шестнадцатеричное целое | указатель на длинное целое (long *arg) |
| u | десятичное целое без знака | указатель на целое без знака (unsigned int *arg) |
| U | десятичное целое без знака | указатель на длинное целое без знака (unsigned long *arg) |
| x | шестнадцатеричное целое | указатель на целое (int *arg) |
| X | шестнадцатеричное целое | указатель на длинное целое (long *arg) |
| e | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| E | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| f | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| g | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| G | число с плавающей точкой | указатель на число с плавающей точкой (float *arg) |
| Символьные данные | ||
| s | строка символов | указатель на массив символов (char arg[]) |
| Примечание: | Размер массива должен быть по крайней мере (n+1) байтов, где n – длина строки s (в символах). Входное поле оканчивается пробелом или символом перехода на новую строку. К символьной строке автоматически добавляется нулевое окончание "\0" и записывается как последний элемент массива. В принципе, использовать такой способ ввода символьных знаков опасно: лучше использовать связку функций: fgets + sscanf. |
|
| c | символ | указатель на символ (char *arg); если ширина поля w задаётся вместе с символом типа c (как например: %5c) – указатель на массив из w символов (char arg[w]); |
| % | символ % | Никакого преобразования не происходит; символ % читается, но не сохраняется. |
| Указатели | ||
| n | отсутствует | указатель на целое (int *arg). Данный указатель хранит количество считанных символов до %n. |
| p | шестнадцатеричное число в форме YYYY:ZZZZ или ZZZZ | указатель на данный объект (дальний или ближний). Преобразования %p предусматривают стандартный размер указателя, принятый в данной модели памяти. |
| Символ преобразования | ||
|---|---|---|
| Целые данные | ||
| d | целое | целое десятичное со знаком |
| i | целое | целое десятичное со знаком |
| o | целое | целое восьмеричное без знака |
| u | целое | целое десятичное без знака |
| x | целое | целое шестнадцатеричное без знака (с буквами a, b, c, d, e, f) |
| X | целое | целое шестнадцатеричное без знака (с буквами A, B, C, D, E, F). |
| f | с плавающей точкой | значение со знаком в форме [-]dddd.dddd |
| e | с плавающей точкой | значение со знаком в форме [-]d.dddde[+/-] |
| g | с плавающей точкой | значение со знаком либо в форме f, либо в форме e, с данным значением и точностью. Хвостовые нули и десятичная точка печатаются только при необходимости |
| E | с плавающей точкой | так же, как в случае e, только с буквой E для обозначения степени |
| G | с плавающей точкой | так же, как в случае g, только с буквой E для обозначения степени |
| Символьные данные | ||
| c | символьное | один символ |
| s | указатель на строку | печатает символы до тех пор, пока не встретится нулевое окончание, либо не будет достигнута заданная длина строки. |
| % | нет символа | печатается только знак % |
| Указатели | ||
| n | указатель на целое | сохраняется (по адресу, указанному во |
| p | указатель | печатает входной элемент как указатель; дальние указатели печатаются, как XXXX:YYYY, ближние указатели печатаются, как YYYY (только смещение). |
| Соглашения | ||
| e или E | аргумент преобразуется в соответствии с шаблоном: [-]d. |
|
| f | аргумент преобразуется в десятичную форму в соответствии с шаблоном [-] |
|
| g или G | аргумент печатается по принципу e, E или f, с точностью, обозначающей число значащих цифр. Хвостовые нули удаляются, десятичная точка ставится только при необходимости. Аргумент печатается по принципу e или f (c некоторыми ограничениями), если символ преобразования g, и по принципу E или f, если указан символ преобразования G. Данные печатаются только в научном формате, если экспонента, полученная в результате либо a) больше, чем точность, либо b) меньше, чем -4. | |
| Замечание. Неопределённые значения (бесконечность) печатаются как +INF и -INF, Не числа IEEE печатаются как + |
||
| Флаги функции printf и их интерпретация | |
|---|---|
| Флаг | Что означает |
| - | Левое выравнивание результата, пробелы остаются справа. Если флаг не задан, результат выравнивается справа, заполняется пробелами или нулями слева. |
| + | Знаковое преобразование: результат всегда начинается со знака '+' или '-'. |
| пусто | Если значение не отрицательно, вывод начинается с пробела вместо плюса; отрицательные значения всегда начинаются со знака минус. |
| # | Специфицирует, что преобразуемый аргумент используется в "альтернативной" форме. Смотри таблицу ниже. |
| Примечание: Знак плюс имеет приоритет над пробелом в обоих случаях. | |
| Символ преобразования | Как # влияет на результат |
| c, s, d, i, u | Не оказывает влияния. |
| x или X | 0x (или 0X)предшествует значению аргумента. |
| e, E, или f | Результат всегда будет содержать десятичную точку, даже если за точкой не следует никаких цифр. Обычно десятичная точка появляется в результате, если за точкой следует цифра. |
| g или G | Аналогично e или E, с дополнением, что хвостовые нули не удаляются. |
SCANF
СИНТАКСИС: %[*][width][F|N][h|l|L]type, где
width - положительное десятичное целое число, определяющее максимальное число символов, которые будут прочитаны из потока stdin согласно спецификации аргумента. Не более чем width считываются и участвуют в присвоении значения, но если встречается пробельный символ или символ, не преобразуемый в указанном формате, ввод завершится раньше;F - префикс к аргументу, указывающий, что используется "дальний указатель" на память;N - префикс к аргументу, указывающий, что используется "ближний" указатель на память;l - указывает, что используется "длинная" ("long") разновидность типа данных (например, long int );h - указывает, что используется "короткая" ("short") разновидность данных (например, short int );type указано в таблице 6.2.Описание строки форматов функции 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 | Новая строка ( |
| \t | Горизонтальная табуляция; |
| \nnn | Символ с кодом nnn в текущей кодировке; |
Более подробное описание форматов функций printf и scanf языка Си смотрите [3], а функции writef языка Turbo Prolog - в [53].
Для потокового ввода-вывода данных (например, при чтении из стандартного потока или при записи в istream и ostream
| ОПЕРАТОР | << (вывода) |
| ОПРЕДЕЛЁН В: | <iostream.h> |
| СИНТАКСИС: | ostream << argument[ << arguments…]; |
| НАЗНАЧЕНИЕ: | Оператор осуществляет вывод в поток ostream аргументов; |
| ОПИСАНИЕ: | Оператор "<<" осуществляет вывод в поток ostream (которым может быть любой поток вывода), указанных после его знака аргументов. Порядок "вычисления" аргументов производится слева направо; |
| ПРИМЕЧАНИЕ: | В заголовочном файле определены операции вывода строки символов, целых, длинных целых значений и значений с плавающей точкой двойной точности. При выводе других значений необходимо "явное" приведение типов; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток ostream, в который был произведён вывод; |
| ОПЕРАТОР | >> (ввода) |
| ОПРЕДЕЛЁН В: | <iostream.h> |
| СИНТАКСИС: | istream >> argument[ >> arguments…]; |
| НАЗНАЧЕНИЕ: | Оператор осуществляет ввод аргументов из потока istream ; |
| ОПИСАНИЕ: | Оператор ">>" осуществляет ввод из входного потока istream (которым может быть любой поток ввода), указанных после его знака аргументов. Порядок ввода элементов из потока - слева направо. Вводимые значения должны соответствовать объявленному типу и должны разделяться пробелом (пробелами); |
| ПРИМЕЧАНИЕ: | В заголовочном файле оператора определены операции ввода строки символов, одинокого символа, короткого целого, целого и длинного целого числа, чисел с плавающей точкой пониженной и удвоенной разрядности. При выводе других значений необходимо "явное" приведение типов. Оператор не вводит пробельных символов; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток istream, из которого был произведён ввод; |
| ФУНКЦИЯ | istream.get |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | istream.get( ch ); char ch; |
| НАЗНАЧЕНИЕ: | Функция ввода одиночного символа; |
| ОПИСАНИЕ: | Указанная функция просто читает один символ и помещает его в свой аргумент. Функция может читать любые символы, в том числе "пробельные" и "двоичные"; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток istream, из которого был произведён ввод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .get, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore. |
| ФУНКЦИЯ | istream.get |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | istream.get( p, n, z='\n' ); char *p; int n; int z; |
| НАЗНАЧЕНИЕ: | Функция чтения из потока строки символов; |
| ОПИСАНИЕ: | Указанная функция читает и размещает по адресу, заданному первым аргументом, не более символов, заданных вторым аргументом. По-умолчанию функция get прочтёт не более чем n символов и не более чем одну строку. Последнее ограничение определяется третьим аргументом - он задаёт символ ограничитель строки, который в операционных системах по-умолчанию является '\n'. Функция позволяет вводить пробельные символы; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток istream, из которого был произведён ввод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .get, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore ; |
| ФУНКЦИЯ | istream. |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | char istream. |
| НАЗНАЧЕНИЕ: | Функция возвращает следующий символ из потока; |
| ОПИСАНИЕ: | Указанная функция возвращает следующий символ из потока, но не удаляет его из потока; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Прочитанный символ или EOF, если достигнут конец потока или произошла ошибка ввода данных; |
| ФУНКЦИЯ | istream.ignore |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | istream.ignore( Limit = 1, Delim = EOF ); int Limit; int Delim; |
| НАЗНАЧЕНИЕ: | Функция пропускает заданное количество символов; |
| ОПИСАНИЕ: | Указанная функция пропускает заданное количество символов (по умолчанию - 1) и останавливается, если встречает символ Delim. По-умолчанию, если не заданы никакие аргументы, функция .ignore() пропускает один символ и останавливается, если встречает конец файла; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток istream, из которого был произведён ввод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .ignore, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .get и .ignore ; |
| ФУНКЦИЯ | ostream.put |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | ostream.put( ch ); char ch; |
| НАЗНАЧЕНИЕ: | Функция выводит одиночный символ; |
| ОПИСАНИЕ: | Указанная функция выводит одиночный символ в поток ostream (которым может быть любой поток вывода). Функция может вывести даже "двоичный символ"; |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток ostream, куда был произведён вывод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .put, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .put и .write ; |
| ФУНКЦИЯ | ostream.write |
| ОПРЕДЕЛЕНА В: | <iostream.h> |
| СИНТАКСИС: | ostream.write( buf, n); const char *buf; int n; |
| НАЗНАЧЕНИЕ: | Функция выводит буфер buf ; |
| ОПИСАНИЕ: | Указанная функция выводит в поток ostream (которым может любой выходной поток) не более чем n символов из буферной строки buf. При этом буфер может содержать не только текстовые, но и двоичные данные! |
| ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Ссылка на поток ostream, куда был произведён вывод; |
| ПРИМЕЧАНИЕ: | Вследствие этого несколько функций .write, выводящих данные в один поток, могут сцепляться, а также могут сцепляться функции .put и .write ; |
Дополнительную информацию о функциях и операторах потокового ввода-вывода данных в C++ смотри [10, 30]
Класс, обеспечивающий ввод данных с консольного устройства. Данный класс был разработан автором [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) смотри в архиве примеров к данному курсу или приведённой выше ссылки Интернета.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.