Ввод и вывод данных

Лабораторная работа N 1

Ввод-вывод в языке программирования C

Цель и задача работы: ознакомление с функциями ввода-вывода, изучение функций языка C, необходимых для работы с файлами. В данной работе реализовать программу, производящую обработку данных, содержащихся в файле. Результаты работы программы также записываются в файл.

Теоретические положения

Функция ввода отвечает за ввод с указанного устройства и перевод данных, представленных в приемлемой для программиста форме, т.е. в виде символов и цифр, в двоичный код в виде нулей и единиц – информацию понятную компьютеру. Для того, чтобы программист мог увидеть результат работы какой-либо программы, нужно перевести двоичный код в приемлемую для человека форму и вывести эти данные туда, куда он укажет.

Простой ввод-вывод

В любых программах функции ввода/вывода играют важную роль. Рассмотрим функции, которые встречаются в большинстве программ.

Самый простой механизм ввода – чтение по одному символу из стандартного входного потока (с клавиатуры) с помощью функции getchar().

Формат процедуры:

int getchar (void);

Здесь определен тип единственного аргумента (void) и тип возвращаемого функцией значения (int).

Инструкция вида:

x=getchar();

присваивает переменной x очередной вводимый символ. Переменная x должна иметь символьный или целый тип. Другая функция putchar(х) выдает значение переменной х в стандартный выходной поток (на экран дисплея).

Формат процедуры:

int putchar (int);

Функции getchar() и putchar() объявлены в стандартном подлючаемом файле stdio.h.

Ввод и вывод данных

Две функции printf() для вывода и scanf() для ввода позволяют преобразовать численные величины в символьное представление и обратно. Они также позволяют выполнить форматированный ввод-вывод.

Функция:

printf(format, arg1, arg2,...)

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

Каждая спецификация преобразования начинается с символа % и заканчивается символом преобразования. Между % и символом преобразования могут находиться:

– знак минус, который говорит о выравнивании преобразованного аргумента по левому краю его поля;

– строка цифр, задающая минимальную ширину поля. Преобразованное число будет напечатано в поле по крайней мере этой ширины, а если необходимо, то и в более широком. Если преобразованный аргумент имеет меньше символов, чем указанная ширина поля, то он будет дополнен слева (или справа, если было указано выравнивание по левому краю) заполняющими символами до этой ширины. Заполняющим символом обычно является пробел, а если ширина поля указывается с лидирующим нулем, то этим символом будет нуль (лидирующий нуль в данном случае не означает восьмеричной ширины поля);

– точка, которая отделяет ширину поля от следующей строки цифр;

– строка цифр (точность), которая указывает максимальное число символов строки, которые должны быть напечатаны, или число печатаемых справа от десятичной точки цифр для переменных типа float или double;

– модификатор длины L, который указывает, что соответствующий элемент данных имеет тип long, а не int.

Ниже приводятся символы преобразования и их смысл:

d или i – аргумент преобразуется к десятичному виду;

c – аргумент преобразуется в беззнаковую восьмеричную форму (без лидирующего нуля);

X или x – аргумент преобразуется в беззнаковую шестнадцатеричную форму (без лидирующих 0X);

u – аргумент преобразуется в беззнаковую десятичную форму;

c – аргумент рассматривается как отдельный символ;

s – аргумент является строкой: символы строки печатаются до тех пор, пока не будет достигнут нулевой символ или не будет напечатано количество символов, указанное в спецификации точности;

E или e – аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]M.NNNNNNE[+-]XX, где длина строки из N определяется указанной точностью. Точность по умолчанию равна 6;

f – аргумент, рассматриваемый как переменная типа float или double, преобразуется в десятичную форму в виде [-]MMM.NNNNNN, где длина строки из N определяется указанной точностью. Точность по умолчанию равна 6;

G или g- используется или формат %E (e) или %f, какой короче. Незначащие нули не печатаются.

Если идущий за % символ не является символом преобразования, то печатается сам этот символ. Следовательно, символ % можно напечатать, указав %%.

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

Функция scanf() является аналогом printf() и выполняет при вводе форматные преобразования в обратном направлении.

Функция

scanf(format, arg1, arg2,...)

читает символы из стандартного ввода, интерпретирует их в соответствии с форматом, указанном в format, и помещает результаты в аргументы. Каждый из аргументов должен быть указателем.

Форматная строка может содержать:

– пробелы, табуляции или символы новой строки ("символы пустых промежутков"), которые игнорируются;

– все символы таблицы ASCII, кроме %;

– спецификации преобразования, состоящие из символа %, необязательного символа подавления присваивания *, необязательного числа, задающего максимальную ширину поля и символа преобразования.

Спецификация преобразования управляет преобразованием следующего поля ввода. Результат помещается в переменную, которая указывается соответствующим аргументом.

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

Символ преобразования определяет интерпретацию поля ввода. Допускаются следующие символы преобразования:

d или i – ожидается десятичное целое, соответствующий аргумент должен быть указателем на целое;

o – ожидается восьмеричное целое (с лидирующим нулем или без него), соответствующий аргумент должен быть указателем на целое;

x – ожидается шестнадцатеричное целое (с лидирующими 0X или без них), соответствующий аргумент должен быть указателем на целое;

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

s – ожидается символьная строка, соответствующий аргумент должен быть указателем на массив символов, который достаточно велик для принятия строки и добавляемого в конце символа \0;

f – ожидается число с плавающей точкой, соответствующий аргумент должен быть указателем на переменную типа float;

Е или e – ожидается число с плавающей точкой. Формат ввода переменной типа float включает необязательный знак, строку цифр, возможно содержащую десятичную точку, и необязательное поле экспоненты, состоящее из буквы E (e), за которой следует целое, возможно имеющее знак.

Перед символами преобразования d (i), о и x может стоять модификатор длины L, который означает, что в списке аргументов должен находиться указатель на переменную типа long, а не типа int. Модификатор длины L также может стоять перед символами преобразования E (e) или f, говоря о том, что в списке аргументов должен находиться указатель на переменную типа double, а не типа float.

Выполнение функции scanf() заканчивается когда она исчерпает свою форматную строку, или когда некоторый элемент ввода не совпадет со спецификацией преобразования. В качестве своего значения scanf() возвращает число правильно введенных элементов. Это число может быть использовано для определения числа элементов ввода. При выходе на конец файла возвращается EOF.

Пример:

printf(²\n %5.3f², 3.14159);

/* Вывод происходит с новой строки. Выводится число с плавающей точкой,

для которого отводится поле шириной 5, в котором 3 позиции отводится

под дробную часть. Результат округляется до третьего знака после

запятой.

*/

Результат на экране дисплея выглядит следующим образом:

3.142

scanf(²%d %c², &a, &b);

/* Вводятся значения переменных целого и символьного типа. */

Строка ввода может иметь следующий вид:

12 w


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: