Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация icon

Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация



НазваниеЛекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация
страница1/7
Дата конвертации06.10.2012
Размер356.93 Kb.
ТипЛекция
  1   2   3   4   5   6   7

Лекция 06
Буферизированный (потоковый) ввод-вывод

Содержание


06.00. Аннотация.

06.01. Стандартные потоки в операционных системах

06.02. Ввод со стандартного потока ввода

06.03. Резюме стандартного буферизированного ввода-вывода

06.04. Вопросы и упражнения.

06.05. Г Л О С С А Р И Й

06.06. Приложение №1

06.07. Приложение №2

06.08. Приложение №3

06.09. Приложение №4

06.00. Аннотация.


На этой лекции Вы познакомитесь с «потоковым» вводом-выводом данных, и подробно рассмотрите операцию потокового ввода с клавиатуры.

06.01. Стандартные потоки в операционных системах

В операционных системах корпорации Microsoft (начиная с версии MS-DOS 2.0) и всех «клонах» UNIX существует возможность «потокового ввода-вывода» данных, например, на консоль, на принтер или в файл.

Принцип «потокового ввода-вывода» следующий:

  1. В оперативной памяти средствами операционной системы создаётся некоторый «промежуточный буфер» для хранения данных, читаемых из файла, устройства или записывания на него этих данных;

  2. Средствами программы, созданной прикладным программистом, происходит чтение или запись информации (символов) в этот буфер;

  3. Средствами операционной системы осуществляется «синхронизация» этого буфера («потока данных») с файлом или устройством;

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

В буфер заносятся только символьные данные. Как следствие, при потоковом выводе нельзя (или «практически нельзя») изменить атрибуты выводимых символов, их шрифтовое и абзацное оформление и т.д. Кроме того, в стандартные потоки ввода-вывода нельзя выводить «двоичные» файлы (то есть файлы, имеющую кодировку, отличную от ASCII и совместимой с ней кодировки). В операционных системах корпорации Microsoft при потоковом вводе-выводе для вывода на консоль кириллических символов возможна только кодировка OEM 866 (кодовая страница MS-DOS для русскоязычных пользователей). Это в настоящее время резко ограничивает применение потокового ввода-вывода для создания программ в современном программировании. Однако этот подход широко востребован в UNIX и её клонах, работающих в режиме командной строки.

Вследствие вышесказанного автор просто обязан рассказать о технологии потокового ввода-вывода. Тем более что при помощи функций sprintf и sscanf (см. Приложение №1) возможна «эмуляция потокового вывода» информации в строку текста, откуда её можно вывести средствами API системных библиотек ввода-вывода (таких как Windows API, GTK+, Qt и др.).

В качестве «стандартных потоков», присутствующих в операционной системе всегда и никогда не удаляемых из оперативной памяти, используются следующие потоки (см. таблицу 06.
I):

  • Стандартный поток ввода (обозначение: stdin, cin и др.) – используется для ввода символьных данных в программу. По-умолчанию этот поток закреплён за клавиатурой компьютера;

  • Стандартный поток вывода (обозначается как: stdout, cout и др.) – используется для вывода символьной информации, полученной в результате работы программы в «штатном режиме». По-умолчанию этот поток закреплён за экраном дисплея;

  • Стандартный поток ошибок (обозначение: stderr, cerr и др.) – используется для вывода символьных диагностических сообщений, ошибок и предупреждений, возникших в результате работы программы. По-умолчанию этот поток закреплён за экраном дисплея;

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

  • Стандартный поток печати (обозначение: stdprn и др.) – используется для вывода результатов работы программы на печать. По-умолчанию этот поток закреплён за текущим принтером в системе, подключённым к порту LPT1. В настоящее время этот поток почти не используется, поскольку чаще проще и безопаснее перенаправить стандартный поток вывода на принтер, чем разделять потоки отдельно для экрана и отдельно для принтера.

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

06.02. Ввод со стандартного потока ввода

Содержание


06.02.01. Ввод средствами языка Си

06.02.02. Ввод средствами языка C++

06.02.03. Ввод средствами языка Basic

06.02.04. Ввод средствами языка Perl

06.02.05. Ввод средствами языка Python

06.02.06. Ввод средствами языка Turbo Prolog

06.02.07. Ввод средствами языка VBScript

06.02.08. Ввод средствами языка Java
^

06.02.01. Ввод средствами языка Си


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

  • для ввода одиночного символа – функцию getchar;

  • для ввода строки символов без ограничения на длину – функцию gets;

  • для «форматированного ввода» символов и их преобразования в «двоичные значения» переменных – функцию scanf;

С синтаксисом и правилами использования этих функций можно ознакомиться в приложении №I к данной лекции. Автор хочет отметить, что использование функций ввода со стандартного потока является небезопасным, а, следовательно, и нежелательным способом ввода данных из стандартного потока. По возможности, заменяйте эти функции функциями потокового чтения данных с «явным» указанием потоков и «длины» прочтённой строки.
Пример 06.001

/* Файл ex06001.c */

/* Функция иллюстрирует потоковый ввод-вывод (как это делать нельзя)*/

#include

#define STR_LENGTH 3 // Длина строки 3 символа

void main()

{

char str[STR_LENGTH]; // Текстовый буфер

char *s; // Временная переменна

s = gets( str );

puts( s );

}

Например, функция, приведённая в примере 06.001, при вводе строки: «aaaaaaaa\n», — вызовет аварийное завершение с ошибкой «переполнение буфера». Поскольку длина текстового буфера – 2 символа (последний символ – «нулевой», знак окончания строки '\0'), то лишние символы, введённые с клавиатуры, попадают в «запредельную» системную область данных. В этом случае происходит операция (прерывание) «отказ системы», и адрес этой системной области оказывается доступной «взломщику системы». Функции, приведённые в примерах 06.002 и 06.003, лишены этих недостатков;
Пример 06.002

/* Файл ex06002.c */

/* Функция иллюстрирует потоковый ввод-вывод (как это делать надо)*/

/* Пример тестировался в системе программировани

Borland C/C++ 3.10 */

#include

#include

#define BUF_LENGTH 7 // Длина строки 3 символа

#define STR_LENGTH 2 // Длина буфера без дескриптора

// Всё те же 2 символа

void main()

{

char str[BUF_LENGTH]; // Текстовый буфер

char *s, c = '\0'; // Временная переменная.

int icsize; // Временная переменная.

icsize = BUF_LENGTH - 2;

str[0] = (char) icsize;

s = cgets( str );

puts( s );

puts( "\nPress any key to continue...");

while( !( c = getch()) ); // Цикл пока не нажата клавиша

}
Пример 06.003

/* Файл ex06003.c */

/* Функция иллюстрирует потоковый ввод-вывод (как это делать надо)*/

/* Пример тестировался в системе программировани

Borland C/C++ 3.10 */

#include

#include

#include

#define STR_LENGTH 3 // Длина строки 3 символа

void main()

{

char str[STR_LENGTH]; // Текстовый буфер

char *s, c = '\0'; // Временная переменная.

int icsize; // Временная переменная.

memset( str, '\0', STR_LENGTH ); // Обнуляем буфер

icsize = STR_LENGTH;

s = fgets( str, icsize, stdin ); // Читаем не более 2 символов с входного потока

// (вместе с нулевым символом)

puts( s );

puts( "\nPress any key to continue...");

while( !(c = getch()) ); // Цикл пока не нажата клавиша

}
  1   2   3   4   5   6   7



Похожие:

Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 08 Буферизированный (потоковый) ввод-вывод Часть III. Содержание 08. 00. Аннотация
На данной лекции Вы познакомитесь с «потоковым» вводом-выводом данных, и подробно рассмотрите операцию вывода в стандартные потоки...
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 07 Буферизированный (потоковый) ввод-вывод Часть II содержание 07. 00. Аннотация
...
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 02 Прямой ввод-вывод: организация и функции Вывод на дисплей. Часть Содержание: 02. 00. Аннотация. 02. 01. Вывод символов на экран 02. 02. Режимы работы дисплея
«Среднеуровневый» ввод-вывод возможен только на консоль, работающую в «текстовом режиме», с помощью «базовых» прерываний ms-dos и...
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 03 Прямой ввод-вывод: Часть II содержание: 03. 00. Аннотация. 03. 01. Очистка экрана 03. 02. Управление курсором 03. 03. Резюме 03. 04. Вопросы и упражнения. 03. 05. Глоссари й
На данной лекции Вы познакомитесь с операциями позиционирования курсора на экране дисплея
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 09 Ввод-вывод с использованием Winapi содержание: 09. 00. Аннотация
На этой лекции Вы познакомитесь с файловыми операциями ввода-вывода с использованием api windows, а также научитесь программировать...
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация icon№ п/п Термин
Потоковый ввод-вывод, направленный не на одно из стандартных устройств ввода-вывода, а в текстовый или двоичный файл
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 05 Ввод с клавиатуры Содержание: 05. 00. Аннотация
«на среднем уровне» позволяет вводить и выводить текстовые символы в файл, на консоль, модем, удалённый терминал. При этом в ms-dos...
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 12 Вывод текста на экран и устройство в Windows Содержание: 12. 00. Аннотация
На данной лекции описываются «собственно» функции вывода текста в окно приложения или во всплывающее окно. Также даётся представление...
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 10 Общие сведения о контексте gdi содержание 10. 00. Аннотация
На лекции описываются типы контекста отображения, правила их использования и функции для работы с разными типами контекстов. Описывается,...
Лекция 06 Буферизированный (потоковый) ввод-вывод Содержание 06. 00. Аннотация iconЛекция 11 Атрибуты и функции работы с контекстом (приложение) Содержание: 11. 00. Аннотация
На данной лекции приводится схематичное описание контекста gdi в Windows api. Вы познакомитесь с тем, какие вообще бывают способы...
Разместите кнопку на своём сайте:
Документы


База данных защищена авторским правом ©podelise.ru 2000-2014
При копировании материала обязательно указание активной ссылки открытой для индексации.
обратиться к администрации
Документы

Разработка сайта — Веб студия Адаманов