Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 643 / 18 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 7:

Буферизированный (потоковый) ввод-вывод. Часть II

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Аннотация: На этой лекции Вы познакомитесь с "потоковым" вводом-выводом данных, и подробно рассмотрите операцию вывода в стандартный поток вывода.

7.1. Вывод в стандартный поток вывода

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

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

  • форматированный вывод - функция printf ;
  • вывод строки символов - функция puts ;
  • вывод одиночного символа - функция putchar ;
  • вывод одиночного символа в поток - функция putc ;

С синтаксисом этих функция можно ознакомиться в приложении №I (7.3) к данной лекции. Автор хочет отметить, что, в отличие от функций чтения консоли, вывод на консоль совершенно безопасен и не приводит к "зависанию" программ и ошибкам системы типа "переполнения буфера". Однако если Вы пишете программу-фильтр, которая будет интенсивно работать с "перенаправлением потоков", необходимо всё-таки использовать функции файлового вывода, указывая в качестве потока вывода поток "stdout".

Пример 7.1

/* File ex07001.c */
/* Пример вывода символов средствами языка Си */
#include <stdio.h>
#include <string.h>
#include <conio.h>
#ifndef	STR_LENGTH
#define	STR_LENGTH	5 // Длина строки 3 символа
#endif
void main()
{
	char str[STR_LENGTH]; // Текстовый буфер
	char c, *s;	// Временная переменна
	int icsize;	// Временная переменна
	memset( str, '\0', STR_LENGTH ); // Обнуляем буфер
	icsize = STR_LENGTH;
	puts( "\nВведите строку символов длиной в 2 символа\n" );
	s = fgets( str, icsize, stdin ); // Читаем не более 2 символов с входного потока
				      // (вместе с нулевым символом)
	printf( "\nДлина строки: %2d символов,", strlen(s) ); //Выводим длину строки
	printf( "\nЗначение строки: %5s.", s ); // Выводим значение строки
	puts( "\nPress any key to continue...");
	while( !(c = getch()) ); // Цикл пока не нажата клавиша
}

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

Консольный потоковый вывод осуществляется при помощи оператора "<<" и функций: cout.put и cout.write. Стандартный поток ввода в языке C++ обозначается как cout (см. таблицу 6.1 к "Буферизированный (потоковый) ввод-вывод" ).

Описание функций для потокового ввода средствами языка C++ смотри в приложении №3 (6.6) к "Буферизированный (потоковый) ввод-вывод" .

C помощью оператора "<<" можно осуществить как неформатированный, так и форматированный ввод-вывод. Однако автор советует для вывода, с целью совместимости с выводом с использованием библиотек API, использовать неформатированный вывод в поток с помощью оператора, а данные для него подготовить при помощи функции sprintf (см. пример 7.2.).

Пример 7.2

/* File ex07002.cpp */
/* Файл иллюстрирует ввод-вывод средствами C++*/
/* Данный пример тестировался в системе программировани
   Borland C/C++ 3.10 */
#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>
#ifndef NAME_LENGTH
#define NAME_LENGTH	81 // Длина строки  80 символов + завершающий символ '\0'
#endif
#ifndef AGE_LENGTH
#define AGE_LENGTH	81 // Длина строки 80 символов + завершающий символ '\0'
#endif
#ifndef OUTPUT_STR_LENGTH
#define OUTPUT_STR_LENGTH	67
#endif
void main( void )
{
	const char format_in[] = "%3d";
	const char format_out[] = "Добрый день, %s!\nВаш возраст, %-.10s, - %3d лет"; // Формат вывода
	char name_length[NAME_LENGTH];
	char cage[AGE_LENGTH];
	char soutstr[OUTPUT_STR_LENGTH];
	char ctemp, c;
	int temp;
	int iage;
	(void) memset( name_length, '\0', NAME_LENGTH ); // Обнуляем строку;
	(void) memset( soutstr, '\0', OUTPUT_STR_LENGTH );
	cerr << "Введите своё имя: ";
	cin >> name_length;
	cerr << "Введите Ваш возраст: ";
	cin >> cage;
	if( !sscanf( cage, format_in, &iage ) ) // Если ошибка ввода
	{
		cerr << "\nНичего не введено или неправильный формат данных!\n";
		return;
	}
	if( iage < 40 )
		temp = sprintf( soutstr, format_out, "Молодой человек", name_length, iage );
	else
		temp = sprintf( soutstr, format_out, "Папаша", name_length, iage );
	if( temp  == EOF ) // Если ошибка вывода
	{
		cerr << "\nНичего не выведено или неправильный формат данных!\n";
		return;
	}
	cout << soutstr; // Выводим сформированную строку
	cerr << "\nПрограмма завершена нормально\n";
	cerr << "\nPress any key to continue...";
	while( !(c = getch()) ); // Цикл пока не нажата клавиша
}

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

Для вывода данных на языке Quick Basic используются операторы PRINT и PRINT USING. Их синтаксис следующий:

ОПЕРАТОР PRINT
НАЗНАЧЕНИЕ: Вывод списка числовых и символьных переменных, выражений и литералов на экран дисплея;
СИНТАКСИС: PRINT [expressionlist] [{; | ,}], где
  • expressionlist - список из одной или более числовых или символьных выражений, выводимых на печать;
  • {; | ,} - разделители, применяемые к выводу следующего выражения и означающие следующее:
    • ; - означает печать сразу после вывода предыдущего выражения;
    • , - означает печать следующего выражения сначала следующей "зоны вывода"
    • <пусто> - означает вывод с новой строки;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
ПРИМЕЧАНИЕ: в Quick Basic зона печати имеет ширину в 14 символов.

ОПЕРАТОР PRINT USING
НАЗНАЧЕНИЕ: Форматированный вывод списка числовых и символьных переменных, выражений и литералов на экран дисплея. Формат выводимых выражений определяется строкой формата: formatstring$ ;
СИНТАКСИС: PRINT USING formatstring$; expressionlist [{; | ,}], где
  • formatstring$ - текстовая строка, содержащая в себе один или более "опций формата". Её формат смотри ниже, в таблице 7.1;
  • expressionlist - список из одной или более числовых или символьных выражений, выводимых на печать;
  • {; | ,} - разделителители, применяемые к выводу следующего выражения и означающие следующее:
    • ; - означает печать сразу после вывода предыдущего выражения;
    • , - означает печать следующего выражения сначала следующей "зоны вывода"
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
Таблица 7.1. Опция строки формата Quick Basic для функции PRINT USING.
Строка форматов Quick Basic для оператора PRINT USING
Символ Назначение
Символы формата для числовых выражений
# Позиция числа
. Позиция десятичной точки
, Запятая, помещённая слева от десятичной точки, печатает запятую перед каждой третьей цифрой
$$ Печатает знак доллара перед числом.
+ Позиция знака числа
** Заполняет предшествующие пробелы числа "звёздочками"
- Помещённый после числа, печатает trailing знак для отрицательных символов.
^^^^ Печатает числа в "научном" ("экспоненциальном") формате
**$$ Комбинация ** and $$.
Символы, используемые для форматирования строковых выражений
& Печатает всю строку
\ \ Печатает первые n символов, где n – число пробелов между чёрточками + 2
! Печатает только первый символ строки
Символы, используемые для печати литеральных символов
_ Печатает следующий символ форматирования как литерал
Любой символ не из этой таблицы печатается как литерал

В качестве примера вывода текста средствами Quick Basic смотри пример 6.5 из предыдущей лекции.

< Лекция 6 || Лекция 7: 1234 || Лекция 8 >
Дмитрий Карпов
Дмитрий Карпов
Россия, Нижний Новгород
Олег Корсак
Олег Корсак
Латвия, Рига