- •Библиотеки и ввод-вывод данных
- •Ввод-вывод данных. Основные понятия
- •Классификация функций ввода-вывода верхнего уровня
- •Обработка ошибок ввода-вывода
- •Открытие, закрытие и удаление файлов
- •Бесформатный ввод-вывод данных текстовых файлов Посимвольный ввод-вывод данных
- •Построчный ввод-вывод данных
- •Построчный вывод данных
- •Форматный ввод-вывод данных текстовых файлов Форматный ввод данных
- •Форматы ввода данных
- •Форматный вывод данных
- •Форматы вывода данных
- •Форматный вывод арифметических данных
- •Форматный вывод символьных и строковых данных
- •Ввод-вывод записей
- •Ввод записей
- •Вывод записей
- •Дополнительные возможности ввода-вывода данных
Построчный ввод-вывод данных
Построчный ввод данных осуществляют функции gets, fgets, getpass.
Функция gets читает строку из стандартного потока stdin и помещает её по адресу символьной строки-параметра функции.
Прототип функции gets:
char *gets (char * string);
В строку включаются все символы до первого символа новой строки ‘\n’, не включая его. Строка-результат дополняется символом конца строки ‘\0’. Поэтому для строки надо выделить ОП на 1 байт больше, чем требуется для вводимых полезных символов.
Прототип функции fgets:
char *fgets (char * string, int n, FILE * stream);
где string – указатель на значение вводимой строки;
n – количество вводимых символов, увеличенное на 1;
stream – имя указателя входного потока.
Функция fgets читает строку из входного потока до наступления одного из событий:
конец строки ‘\n’, который включается в считанную строку;
достигнут конец файла;
прочитано (n –1) символов.
Результат помещается в строку string и дополняется символом конца строки ‘\0’. Для строки-результата ОП должна быть на 2 байта больше, чем требуется для вводимых символов строки: для символов ‘\n’ и ‘\0’.
Возвращаемые значения gets и fgets:
адрес строки string с результатом, если чтение прошло успешно;
NULL, чтение неуспешно: ошибка или достигнут конец файла.
Эту ситуацию можно распознать из анализа значения, возвращаемого функцией.
Пример Ввод строки с клавиатуры функцией gets в переменную a-массив символов
#include <stdio.h>
void main(void)
{ char a[50];
if (!gets(a))//Ввод неуспешен, если ввести только конец файла
printf(“\n Ошибка при вводе’a’\n”);
puts(a);
}
Пример Ввод строки из файла в переменную a-массив символов
#include <stdio.h>
FILE* f;
void main( )
{ char a[50];
f = fopen(“name_1”, “r”);
if (!fgets(a,12,f))//Ввод неуспешен, если ввести только конец файла
printf(“\n Ошибка при вводе’a’\n”);
puts(a);
}
Рассмотрим пример ввода строк до конца файла на основе анализа результата функции feof:
while( !feof(fid))
{fgets(str,50,fid);…
Так как в Си нет контроля длины строки при её размещении в ОП, превышение длины введённого значения над выделенной ОП может привести к искажению других данных в ОП, в том числе и самой ОС.
Функция getpass используется для ввода с клавиатуры пароля, то есть строки без эхопечати.
Прототип функции getpass:
char * getpass (char * zapros);
где zapros – указатель на символьную константу или символьная константа, содержащая приглашение к вводу пароля.
Возвращаемое значение getpass: указатель на строку с типом static из не более 8 символов с завершающим нулём. Это значение может быть присвоено переменной-указателю на данные типа char.
Пример Использование функции getpass
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main(void)
{ static char *b;
b = getpass(“введите пароль:”)
// printf(“\n b = ‘%s’”, b); это – отладочный ввод
if (strcmp(b, “пароль”)) /*Сравнение двух строк;
истинно при несовпадении двух строк*/
printf (“Вы ошиблись…\n;”)
}