Консольные функции gets() и puts() позволяют считывать и записывать строки.
Функция gets() считывает строку символов с клавиатуры, и размещает ее по адресу, указанному в аргументе.
Т.к. функция работает с буфером, на время ее работы выполнение программы приостанавливается, она ожидает ввода текста с клавиатуры, признаком окончания ввода является клавиша ENTER, после чего строка, введенная пользователем, присваивается переменной в качестве значения.
Следует обратить внимание, что при использовании функции gets(), несмотря на нажатии клавиши ENTER, в конец строки ставится не символ перехода на новую строку, а нулевой символ ‘\0’ – признак конца строки.
При наборе строки допускается ее редактирование.
В качестве аргумента указывается массив символов, в который и будут записаны символы, введенные пользователем.
Пример 4. Ввести строку текста в массив, вывести строку на экран.
# include <stdio.h>
void main()
{char buffer[125];
printf (“Vvedite stroky”);
gets (buffer);
printf(“stroka: %s \n”, buffer);
}
Функция gets() будет рассматривать символы, введенные с клавиатуры, как значение строковой переменной с именем buffer. Следует помнить, что один элемент необходим для символа конца строки, поэтому длину массива указывать необходимо на единицу больше максимальной строки.
Функция puts() выводит на экран строку символов и переводит курсор на следующую строку. Если при выводе возникла ошибка, то функция возвращает константу EOF.
В качестве параметра могут выступать:
- строковый литерал,
- строковая константа,
- строковая переменная.
Хорошо известную фразу можно записать так:
puts(“Hello, world!!!”); // это строковый литерал
2.3 Обзор консольных функций ввода / вывода
Сведения об основных функциях ввода / вывода приведены в табл. 1
Таблица 1
Функция
Операция
getchar()
Считывает символ с клавиатуры, выводит его на экран, ожидает перехода на новую строку
getch()
Считывает символ с клавиатуры и не выводит его на экран, не ожидает перехода на новую строку
putchar()
Выводит символ на экран
gets
Считывает строку с клавиатуры, ожидает перехода на новую строку
puts()
Выводит строку на экран и переводит курсор на следующую строку
2.4. Форматированный ввод / вывод данных
Функции printf() и scanf() выполняют форматированный ввод / вывод на консоль, т.е. они могут считывать и записывать данные в заданном формате и с комментариями. Обе функции могут оперировать любыми встроенными типами данных, включая символы, строки и числа.
Функцию printf() часто называют «выводом с форматированием».
Первый аргумент функции, в кавычках называют строкой форматирования, т.к. она указывает, как нужно производить вывод, т.е. определяет формат вывода, последующие аргументы указывают, что нужно выводить.
Строка форматирования содержит элементы трех типов:
- обычные символы, которые просто копируются в стандартный выходной поток (выводятся на экран дисплея),
- команды форматирования, которые определяют тип отображаемого аргумента,
- управляющие символьные последовательности, которые осуществляют форматирование.
Команда форматирования начинается с символа %, за которым следует код формата. Основные команды форматирования представлены в табл. 2
Таблица 2. Команды форматирования функций printf() и scanf()
Команды
Пояснение
%с
символ
%s
Строка символов
%d, %i
Десятичное целое со знаком
%u
Десятичное целое без знака
%f
Вещественное число (с плавающей точкой)
%e
Экспоненциальное представление вещественного числа
%o
Восьмеричное число без знака
%x
16-ричное число без знака
Количество аргументов после строки форматирования должно совпадать с количеством команд форматирования, причем совпадение обязательно и в порядке их следования.
При форматировании необходимо не только выводить символы, но и управлять выводом, например переводить строки, делать отступы и т.д. Для этой цели служат управляющие символы. Каждый такой символ начинается с символа обратной косой черты (\), который указывает на то, что символы, расположенные за ним, являются управляющими. Когда компилятор встречает \, он не отображает следующие символы, а выполняет действие, на которое они указывают.
Пример 5. Вывод значений трех переменных на экран терминала. Для большей наглядности различные элементы функции printf() выделим различными шрифтами.
Комбинация символов %d служит своего рода указателем места в строке, куда необходимо вставить значение переменной при печати.
Пусть 5, 15, 25 – это значения переменных x, y, z. Тогда на экране будет отображено следующее:
Vivod trex zelix chisel:
x = 5 y = 15 z = 25
Функция scanf() считывает данные с клавиатуры и сохраняет информацию в переменных, заданных аргументами, перечисленным в списке аргументов.
Формат вызова:
#include <stdio.h>
scanf(“форматирование”, аргумент_1, …);
Аналогично функции printf() используются команды форматирования.
Пример 6. Ввод различных данных
#include <stdio.h>
int i;
float fp;
char c, s[81];
scanf(“%d %f %c %s”, &i, &fp, &c, &s);
2.5 Сравнительная характеристика консольных функций ввода / вывода
Функции, используемые для ввода и вывода данных, зависят от типа данных и способа их представления. Остановимся на свойствах функций printf() и scanf(), главное из которых возможность работать с самыми разнообразными данными. Например, с помощью одной и той же функции scanf() можно вводить как числовые, так и символьные данные. Кроме того, функции printf() и scanf() позволяют работать со списком из нескольких аргументов, т.е. вводить или выводить сразу несколько переменных, а также форматировать выводимые данные. Итак, функции printf() и scanf() универсальны и это делает их привлекательными, но, с другой стороны, следует отметить, что эти функции достаточно громоздкие (занимают много места) и медленно работают. Поэтому для работы с текстовой информацией в состав библиотек входят специальные функции для работы как с отдельными символами, так и с целыми строками.
Если необходимо работать с отдельными символами, то наиболее удобно работать с функциями getch, getchar(), putchar. Для работы с целыми строками использовать лучше функции gets(), puts().
Но все эти функции ввода / вывода данных имеют только один аргумент (параметр), а это означает, что они могут отображать только один объект.
3. Функции ввода / вывода библиотеки iostream
Библиотека iostream – стандартная библиотека языка С++.
Поток в С++ - это логическое устройство, получающее или передающее информацию. Поток связан с физическим устройством ввода / вывода. Все потоки функционируют одинаков, хотя физические устройства, с которыми они связаны, могут быть самыми различными.
Потоки, определенные в языке С++:
cin – стандартный ввод,
cout – стандартный вывод,
cerr – стандартная ошибка,
clog – буферизованная версия cerr.
По умолчанию эти потоки связаны с консолью:
cin – с клавиатурой,
coun, cerr, clog – с терминалом.
Операции ввода / вывода языка С++:
Вывод <<,
Ввод >>.
Пример 7. Напечатать на терминале строку текста: “Primer vivoda - 34”
cout << “Primer vivoda - ” << 34;
Пример 8. Ввести целое число в переменную х
…
int x;
cin >> x;
Пример 9. Ввести строку текста в статический массив
…
char str[80];
cin >> str;
4. Файловый ввод – вывод
Файл является набором данных, обычно на диске, со своим именем.
Компилятор языка С, С++, а также функции и макрокоманды, работающие с файлом, рассматривают файл как структуру, предопределенную в компиляторе, подобно стандартным типам данным, которая содержит необходимую информацию для связи программы с внешними устройствами и для работы с буфером. Файл определяется структурой, стандартное наименование этой структуры – FILE. Т.о., любая программа, работающая с файлами, должна использовать этот тип структуры. Для работы с файлами используются специальные файловые потоки, обмен осуществляется с помощью функций потокового ввода / вывода. Перечень файловый функций (режим открытия файла) представлен в табл. 3. Благодаря работе этих функций алгоритм взаимодействия с файловой структурой скрыт от пользователя.
Таблица 3. Режимы работы с файлами
Режим
Описание
r
Файл открывается для чтений
w
Открывается пустой файл для записи (если файл существует, он стирается). Переписать или создать новый файл для записи
a
Файл открывается для добавления информации в его конец (т.е. дополнить или создать файл для записи)
r+
Файл открывается для чтения и записи (файл должен существовать)
w+
Открывается пустой файл для чтения и записи (если файл существует, он стирается), т.е. создать новый файл для чтения и записи
a+
Открывается файл для чтения и добавления информации в его конец (т.е. дополнить или создать файл для чтения и записи)
Остановимся подробнее на свойствах файлов:
- файлы могут изменять свой размер,
- обращение к элементам файла производится при помощи специальных функций или макроопределения,
- доступ к элементу происходит в текущей позиции файла (позиция чтения / записи),
- текущая позиция автоматически продвигается при операциях чтения / записи, т.е. файл просматривается последовательно.
Для того, чтобы изменить последовательный просмотр файла (организовать произвольный доступ), существуют функции изменения текущей позиции в файле.