Ввод/вывод файлов в языке 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. Действие модификаторов размера

    ЗначениеФорматИнтерпретация
    hd, o, u, x, Xshort int
    ld, o, u, x, Xlong int
    le, E, f, g, Gdouble
    Le, E, f, g, Glong double
    Ld, o, u, x, X__int64
    hс, С1 символьный байт
    lс, С2 символьных байта
    hs, S1 строка символов по 1 байту на символ
    ls, S1 строка символов по 2 байта на символ

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

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



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

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