Ввод/вывод файлов в языке C. Функции стандартного ввода/вывода в языке C

   
На этом шаге мы рассмотрим функцию printf().

   
Одно из таких функций является функция printf(). Ее формат:

  printf (Control, argl, arg2, ..., argn);

Функция форматного вывода. Выводит на экран содержимое arg1, arg2, ..., argn и возвращает количество выводимых байтов.

   
Здесь Control - управляющая символьная строка, в которой находятся форматы вывода на экран для соответствующих аргументов arg1, arg2, ..., argn, т. е. первый
формат- для вывода arg1, второй - для arg2 и т. д.

   
Все символы, находящиеся между форматами, выводятся один к одному (т. е. не форматируются), что дает возможность вывода дополнительного текста для улучшения читаемости результата вывода.

   
Форматы вывода задаются так: любой формат начинается с символа % и заканчивается одним из символов форматирования:

  • d - аргумент преобразуется к десятичному виду (с учетом знака);
  • o - аргумент преобразуется к восьмеричному беззнаковому виду;
  • х - аргумент преобразуется в беззнаковую шестнадцатеричную форму (с символами a, b, с, d, е, f);
  • X - аргумент преобразуется в беззнаковую шестнадцатеричную форму (с символами А, В, С, D, E, F);
  • U - аргумент преобразуется в беззнаковую десятичную форму;
  • c - аргумент рассматривается как отдельный символ;
  • s - аргумент рассматривается как строка символов; символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов,
    указанное в спецификаторе точности (о спецификаторе точности скажем далее);
  • е - аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму в экспоненциальном [-]m.nnnnnnе[+-]хх, где длина
    строки из n определяется указанной точностью. По умолчанию точность равна 6;
  • Е - то же, что и е, но с Е для экспоненты;
  • f - аргумент рассматривается как переменная типа float или double и преобразуется в десятичную форму в виде [-]m.nnnnnn, где длина
    строки из n определяется указанной точностью. По умолчанию точность равна 6;
  • g - используется либо формат %е, либо %f: выберется тот формат, который даст изображение числа меньшим количеством знаков с учетом заданной точности.
    Незначащие нули не печатаются;
  • G - то же, что и g, но с Е для экспоненты, если используется формат е;
  • n - указатель на целое со знаком;
  • р - входной аргумент выводится как указатель. Формат зависит модели используемой памяти. Он может быть вида XXXX:YYYY или YYYY (только смещение).

   
Между границами формата вывода находятся:

  [флажки] [ширина] [.точность] [F|N|h|l|L].
  • квадратные скобки означают, что элемент, входящий в них, может отсутствовать для какого-то формата. Например, если выводится десятичное число, то точность для него не имеет смысла;
  • флажки определяют выравнивание выводимого значения (по правому или по левому краю поля вывода), знаки числа, десятичные точки, конечные нули, восьмеричные и шестнадцатеричные префиксы. Флажки имеют следующий смысл:
    • - (минус) - выравнивание результата по левому краю поля вывода (число будет прижато к левой границе поля вывода) и заполнение поля вывода справа пробелами. Если этот флаг не задан, то результат
      выравнивается по правому краю поля вывода, а оставшееся слева пространство заполняется пробелами или нулями;
    • + - преобразование результата к виду со знаком: результат всегда начинается со знака "+" или "-";
    • пробел - если значение неотрицательное, то вместо плюса выводится пробел. Для отрицательных чисел выводится минус;
    • # - указывает, что аргумент должен быть преобразован с использованием альтернативной формы. Это означает, что если флажок # используется вместе с символом преобразования (форматирования),
      то при преобразовании аргумента для символов с, s, d, u, i, о, x, X символ # не влияет на результат. Для символов е, Е, f результат всегда будет содержать десятичную точку, даже
      если за точкой не следует никаких цифр (обычно десятичная точка появляется, если за ней следует цифра). Для символов g, G результат будет как для символов е, Е, но с тем отличием, что хвостовые нули не будут удаляться.

       Примечание. Если заданы и пробел, и знак "+", то преимущество имеет знак "+".

  • спецификатор ширины определяет размер поля для выходного значения. Ширину можно задать двумя способами:
    • напрямую - строкой десятичных цифр;
    • косвенно - через символ * (в этом случае аргумент должен иметь тип int). Если для задания ширины используется символ * (звездочка), то спецификация ширины
      указывается не в строке Control, а в списке аргументов перед соответствующим аргументом.

    Спецификаторы ширины:

    • n - в этом случае выведется не менее n символов. Если в выводимом числе символов меньше, чем n, то оставшаяся часть поля
      заполнится пробелами справа (если задан флажок), и слева в противном случае;
    • 0n (например, 04) - будет выведено не менее n символов. Если в выводимом числе символов меньше, чем n, то оставшаяся часть поля заполнится слева нулями;
    • * (для формата d) - если для задания ширины используется символ "*", то спецификация ширины указывается не в строке Соntrol, а в списке аргументов перед
      тем аргументом, для которого она определена. Причем ширина представляет собой отдельный аргумент. Например, выводим значение переменной i=2, используя printf ("%*d\n", 5, i);.
      Результат будет пппп2 (где п - пробел). Здесь ширина задана равной 5 и указана в списке аргументов отдельно, но перед тем аргументом, для которого она определена;
  • спецификатор точности задает число выводимых символов после точки (дробная часть числа). Задание спецификатора точности всегда начинается со знака точки (чтобы
    отделить его от спецификатора ширины). Как и спецификатор ширины, точность может задаваться двумя способами:

    • напрямую - заданием числа;
    • косвенно - указанием символа *. Если вы используете * для спецификатора точности, то спецификация точности должна указываться не в строке Control, а в списке
      аргументов перед соответствующим аргументом как отдельный аргумент (через запятую).

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

      float nn = 12.567;
      printf ("%.*f\n", 2, nn);   //вывести 2 знака после точки
    

    Результат: 12.57.

  • модификаторы размера, задаваемые в формате, определяют, как функция интерпретирует аргумент. Действие модификаторов показано в таблице 1.
    Таблица 1. Действие модификаторов размера

    Значение Формат Интерпретация
    h d, o, u, x, X short int
    l d, o, u, x, X long int
    l e, E, f, g, G double
    L e, E, f, g, G long double
    L d, o, u, x, X __int64
    h с, С 1 символьный байт
    l с, С 2 символьных байта
    h s, S 1 строка символов по 1 байту на символ
    l s, S 1 строка символов по 2 байта на символ

       
    Например, если мы выводим данные типа long, то должны задавать вместе с форматом d и модификатор типа l, т. е общий вид формата будет ld.

   
На следующем шаге мы закончим изучение этого вопроса.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий