Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

К другим спецификаторам преобразований относятся следующие:

%d
— считывание десятичного целого;

%o
,
%x
— считывание восьмеричного, шестнадцатеричного целого;

%f
,
%e
,
%g
— считывание числа с плавающей запятой;

%c
— считывание символа (пробельный символ не пропускается);

%s
— считывание строки;

%[]
— считывание множества символов (см. последующее обсуждение);

%%
считывание знака
%
.

Как и в случае

printf
, у спецификаторов преобразований функции
scanf
есть ширина поля, ограничивающая объем ввода. Спецификатор размера (
h
для коротких или
l
для длинных целых) показывает, короче или длиннее стандартного получаемый аргумент. Таким образом,
%hd
обозначает число типа
short int
,
%ld
— число типа
long int
и
%lg
— число с плавающей точкой двойной точности.

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

Применяйте спецификатор

%c
для чтения одиночного символа во вводе. Он не пропускает начальные пробельные символы.

Используйте спецификатор

%s
для чтения строк, но будьте осторожны. Он пропускает ведущие пробельные символы, но останавливается перед первым пробельным символом, встретившимся в строке, поэтому лучше применять его для чтения слов, а не целых строк. Кроме того, длина строки, которую он может прочесть, ограничивается только спецификатором ширины поля, поэтому принимающая строка должна быть достаточной для хранения самой длинной строки из вводного потока.

Лучше применять спецификатор ширины поля или комбинацию функций

fgets
и
sscanf
для считывания строки ввода, а затем просматривать ее. Это защитит от возможных переполнений буфера, которые может спровоцировать злонамеренный пользователь.

Применяйте спецификатор

%[]
для чтения строки, составленной из символов, включенных в множество. Формат
%[A-Z]
будет читать строку из прописных букв латинского алфавита. Если в множестве первый символ — знак вставки (
^
), то спецификатор считывает строку, состоящую из символов, не входящих в множество. Итак, для того чтобы прочитать строку с пробелами, но остановиться на первой запятой, примените спецификатор
%[^, ]
.

Если задана следующая строка ввода:

Hello, 1234, 5.678, X, string to the end of the line

приведенный далее вызов

scanf
корректно считает четыре элемента:

char s[256];

int n;

float f;

char c;

scanf("Hello, %d, %g, %c, %[^\n]", &n, &f, &c, s);

Функции семейства

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

Функция

scanf
и другие члены семейства, как правило, не высоко ценятся в основном по трем причинам:

традиционно их реализации полны ошибок;

в использовании эти функции не гибки;

они могут привести к созданию программного кода, в котором трудно решить, что подвергать синтаксическому анализу.

В качестве альтернативы попытайтесь применять другие функции, такие как

fread
или
fgets
, для чтения строк ввода, а затем воспользуйтесь строковыми функциями для разделения введенной строки на нужные элементы.

Другие потоковые функции

В библиотеке stdio существует ряд других функций, использующих потоки как параметры или стандартные потоки

stdin
,
stdout
,
stderr
:

fgetpos
— возвращает текущую позицию в файловом протоке;

fsetpos
— устанавливает текущую позицию в файловом потоке;

ftell
— возвращает величину текущего смещения файла в потоке;

rewind
— сбрасывает текущую позицию файла в потоке и переводит ее в начало файла;

freopen
— повторно использует файловый поток;

setvbuf
— задает схему буферизации для потока;

remove
— эквивалент функции
unlink
, до тех пор пока параметр
path
не является каталогом, в этом случае она эквивалентна функции
rmdir
.

Эти библиотечные функции описаны на страницах интерактивного справочного руководства в разделе 3.

Вы можете использовать функции обработки файловых потоков для повторной реализации с их помощью программы копирования файлов. Взгляните на программу copy_stdio.c в упражнении 3.3.

Упражнение 3.3. Третья версия программы копирования файлов

Эта программа очень похожа на предыдущие версии, но посимвольное копирование выполняется с помощью вызовов функций, заданных в файле stdio.h:

#include <stdio.h>

#include <stdlib.h>

int main {

 int c; 

 FILE *in, *out;

 in = fopen("file.in", "r");

 out = fopen("file.out", "w");

 while((c = fgetc(in)) != EOF) fputc(c, out);

 exit(0);

}

Выполнив эту программу, как прежде, вы получите:

$ TIMEFORMAT="" time ./copy_stdio

0.06user 0.02system 0:00.11elapsed 81%CPU

Как это работает

На этот раз программа выполняется 0,11 с, не так быстро, как низкоуровневая блочная версия, но значительно быстрее другой посимвольной версии. Это произошло потому, что библиотека stdio поддерживает внутренний буфер в структуре

FILE
, и низкоуровневые системные вызовы выполняются, только когда буфер заполняется. Не ленитесь экспериментировать, тестируя программный код построчного и блочного копирования с помощью stdio, чтобы увидеть, как они действуют в случае проверенных нами трех примеров.

Поделиться:
Популярные книги

Черный Маг Императора 17

Герда Александр
17. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 17

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет

Изгой Проклятого Клана. Том 6

Пламенев Владимир
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6

Охотник

Щепетнов Евгений Владимирович
Фантастика:
фэнтези
боевая фантастика
5.40
рейтинг книги
Охотник

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Возвращение

Кораблев Родион
5. Другая сторона
Фантастика:
боевая фантастика
6.23
рейтинг книги
Возвращение

Неофит

Листратов Валерий
3. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неофит

Московское золото и нежная попа комсомолки. Часть Четвертая

Хренов Алексей
4. Летчик Леха
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Московское золото и нежная попа комсомолки. Часть Четвертая

Я до сих пор не князь. Книга XVI

Дрейк Сириус
16. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я до сих пор не князь. Книга XVI

Алтарь

Жгулёв Пётр Николаевич
3. Real-Rpg
Фантастика:
фэнтези
7.00
рейтинг книги
Алтарь

На границе империй. Том 10. Часть 10

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 10

Отморозок 1

Поповский Андрей Владимирович
1. Отморозок
Фантастика:
попаданцы
5.00
рейтинг книги
Отморозок 1

Двойник Короля 5

Скабер Артемий
5. Двойник Короля
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Двойник Короля 5

Двенадцатая реинкарнация. Трилогия

Богдашов Сергей Александрович
Фантастика:
боевая фантастика
5.60
рейтинг книги
Двенадцатая реинкарнация. Трилогия