Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование видеоадаптеров CGA, EGA и VGA

© Александр Фролов, Григорий Фролов
Том 3, М.: Диалог-МИФИ, 1992, 287 стр.

[Назад] [Содеожание] [Дальше]

12.1. Вывод на дисплей через стандартный выходной поток

Функции putchar() и putc()

Эти функции помещают один символ в текущую позицию выходного потока. Прототипы функциий представлены ниже:

int putc( int ch, FILE *stream );

int putchar( int ch );

Функция putc() отличается от putchar() наличием второго аргумента, который определяет выходной поток, в который помещается символ. Она может использоваться и для записи символов в открытый файл и для записи в стандартные потоки ввода-вывода. В частности, если второй аргумент функции равен константе stdout, то она эквивалентна функции putchar() и выводит символ в стандартный выходной поток. Этот поток может идти на экран дисплея или в файл, если используется свойство переназначения потока. Фактически функция putchar() является макроопределением:

#define putchar(_c)      putc((_c),stdout)

Первые параметры обеих функций совпадают по смыслу и задают ASCII-код выводимого символа (не смотря на то, что переменная ch целого типа, используется только ее младший байт). При этом функции обрабатывают управляющие символы. Список управляющих символов приведен в таблице 13.1:


Символ   Код ASCII       Значение


\a      07h            звуковой сигнал

\b      08h            перемещение назад

\f      0Ch            переход к новой
                  странице

\n      0Ah            новая строка

\r      0Dh            возврат каретки

\t      09h            горизонтальная
                  табуляция

\v      0Bh            вертикальная 
                  табуляция


\'      27h            символ кавычки

\"      22h            двойная кавычка

\\      5Ch            обратный слеш

\%      25h            знак процента

Таблица 13.1 Управляющие символы.

Функции возвращают ASCII-код выведенного символа, а в случае ошибки возвращают константу EOF. Чтобы конкретизировать ошибку можно воспользоваться функцией ferror().

// использование функци putchar()

#include <stdio.h>

void main(void) {

   char *ptr,
      out_str[] = "\aputchar\nputc\a";

   for(ptr = out_str; *ptr; putchar(*(ptr++)) );
}

Включаемый файл stdio.h содержит спецификации функций putchar() и putc(). Следовательно, этот файл необходимо включать во все программы, использующие данные функции.

Функция puts()

Функция puts() позволяет записать строку в стандартный выходной поток stdout. Строка должна оканчиваться нулем (символ '\0'). Этот символ не помещается в выходной поток. Вместо него записывается упрвляющий символ '\n', который переводит курсор в начало новой строки.

Функция имеет следующий прототип:

int puts( char *string );

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

При использовании функции puts() необходимо включить директивой include файл stdio.h, содержащий спецификацию этой функции.

// использование функци puts

#include <stdio.h>

void main(void) {
   puts("Работает функция puts!");
}

Функция printf()

Наиболее универсальной стандартной функцией, обеспечивающей запись в выходной поток stdout, является функция printf(). Она производит вывод на экран дисплея строк, отдельных символов и чисел в различных форматах.

Приведем прототип функции printf():

 int printf( char *format [,argument]... );

Первый аргумент функции содержит указатель на управляющую строку, которая может состоять из:

  • непосредственно выводимых символов,
  • управляющих символов,
  • спецификаторов формата.

Непосредственно выводимые символы и управляющие символы помещаются в выходной поток без изменения.

Если управляющая строка содержит спецификаторы формата, то каждому спецификатору должен соответствовать один аргумент, следующий за управляющей строкой. Аргументы представляют собой переменные или константы, которые преобразуются согласно соответствующих им спецификаторов формата и затем также помещаются в выходной поток.

Различные спецификаторы формата перечислены в таблице 13.2:


Спецификатор формата      Тип данных


%d, %i         целое десятичное число

%s            текстовая строка

%c            один символ

%e, %E         число с плавающей точкой в
            экспоненциальной форме

%f            число с плавающей точкой в
            десятичной записи

%u            целое десятичное число без
            знака

%o            целое восьмеричное число без
            знака

%x, %X         целое шестнадцатиричное число             без знака

%g, %G         либо %e, либо %f в
            зависимости от того, запись в
            каком формате короче

%p            значение указателя 

%n            число символов

Таблица 13.2 Спецификаторы формата функции printf().

В более общем случае, в спецификаторе формата между символом '%' и символом, определяющим тип преобразования можно разместить флаги и префиксы типов:

% [флаг] [ширина] [.точность] [префикс типа] символ преобразования

Флаги приведены в таблице 13.3, а префиксы типов в таблице 13.4.

Поле [ширина] задает мимнимальную ширину поля, используемую при печати строки или числа. Если это число или строка не помещаются в поле целиком, то ширина поля увеличивается.

Поле [.точность] определяет для чисел количество отображаемых после запятой цифр, а для строк - максимальное число символов в строке.


Флаг      Значение


-      выравнивание по левой границе

+      перед числом помещается его знак

пробел (' ')   перед данными помещается пробел

Таблица 13.3 Флаги.


Префикс типа   Значение


F      дальний указатель

N      ближний указатель

h      короткое целое

l, L      длинное целое

Таблица 13.4 Префиксы типов.

Функция printf() возвращает число напечатанных ею символов или в случае ошибки - отрицательную величину.

Использование различных спецификаторов формата демонстрируется следующим примером:

// при использовании printf также необходим файл stdio.h

#include <stdio.h> 

void main(void) {

   int  char_count;
   char ptr[] = "строка";

   printf("\n%23d  \n%e  \n%.3E  \n%f  \n%+g  \n%-23G \n\n",
         1111,   0.01, 0.01,   0.01, 0.01,  0.0000001);

   printf("%s%n", ptr,  &char_count);

   printf("\n\nПредыдущая функция вывела %d символов.\n\n", 
          char_count);

   printf("Это %s, расположенная по адресу %Lp.\n\a", ptr, ptr);
}
[Назад] [Содеожание] [Дальше]