Что возвращает fscanf в си

Функция scanf

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

В функции scanf могут быть явно записаны какие-то символы, кроме форматных строк. Например, вызов

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

Особенности считывания чисел

Функция scanf корректно считывает целые числа, если они начинаются с символа 0, или со знака «+». То есть числа «+123» или «0123» будут корректно считаны по форматной строке «%d», никаких дополнительных параметров задавать не нужно.

Также при считывании чисел игнорируются пробелы перед числом. Это означает, что вызов

Чтобы считать записать вида «01␣:␣23» можно использовать форматную строку «%d :%d», причем пробел в форматной строке может означать и отсутствие пробелов.

Возможные форматные символы

Форматная
строка
Соответствующий ей тип
%hhdСчитать число (десятичное) и записать его в переменную типа char (для unsigned char нужно использовать %hhu)
%hdshort int (для unsigned short int нужно использовать %hu)
%dint (для unsigned int нужно использовать %u)
%ldlong int (для unsigned long int нужно использовать %lu)
%lldlong long int (для unsigned long long int нужно использовать %llu)
%ffloat
%lfdouble
%Lflong double
char. Считывается один символ, он может быть пробелом или символом конца строки.
%sСчитывается последовательность непробельных символов (строка), записывается в C-строку (типа char * или char[])

Особенность считывание символов

Считывание одного символа «%c» считывает из потока ввода следующий символ, он может быть в том числе и пробельным символом, а также символом конца строки. Но если в форматной строке перед «%c» поставить пробел, то поскольку пробел в форматной строке обозначает последовательность пробельных символов любой длины, то в этом случае будет считан следующий непробельный символ.

Особенность считывания строк

При считывании строки результат записывается в С-строку, которая представляет собой массив символов (или указатель типа char * с выделенной памятью). Поскольку строка в языке C является адресом (указателем) в памяти, где хранится начало строки символов, то передавать в функцию scanf нужно имя переменной без указания амперсанда.

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

Функция gets считается опасной и не рекомендуется для использования, так как она не контролирует количество считанных символов и не учитывает длину передаваемой строки, что может привести к записи данных за пределами строки.

В данном случае мы использовали stdin для чтения со стандартного ввода.

Возвращаемое значение

Функция scanf возвращает значение, равное числу успешно считанных и записанных в переданные параметры значений, что можно использовать для анализа входных данных.

Тогда при вводе строки «12:34» функция scanf считает два числа, запишет их в переменные a и b и вернет значение 2. А при вводе «12 34» будет считано только одно число, поскольку после него должно идти двоеточие, то второе число считано не будет и функция scanf вернет значение 1.

Источник

Что возвращает fscanf в си

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

ОПИСАНИЕ

Если количество определителей преобразования в format превышает количество параметров указателей, то результат не определён. Если количество параметров указателей превышает количество определителей преобразования, то лишние параметры указатели вычисляются, но игнорируются.

Функция scanf() считывает информацию из стандартного потока ввода stdin; fscanf() считывает информацию из потока, на который указывает stream, а sscanf() считывает информацию из символьной строки, на которую указывает str.

Функция vfscanf() является аналогом vfprintf(3) и читает информацию из потока, на который указывает указатель stream, используя список указателей переменной длины (смотрите stdarg(3)). Функция vscanf() считывает список параметров переменной длины из стандартного ввода, а функция vsscanf() считывает его из строки. Эти функции являются аналогами функций vprintf(3) и vsprintf(3), соответственно.

Строка format состоит из последовательности инструкций (directives), которые описывают порядок обработки входных символов. Если обработка инструкции завершается с ошибкой, то чтение прекращается и scanf() завершает работу. «Отказом» может быть: ошибка ввода, то есть недоступность входных символов или ошибка совпадения, то есть получены неподходящие данные (смотрите далее).

Инструкцией может быть:

Каждый определитель преобразования в format начинается с символа «%» или последовательности символов «%n$» (смотрите о разнице далее) за которым следует:

Определители преобразования в format бывают двух видов: начинающиеся с «%» и начинающиеся с «%n$». Эти два вида не должны использоваться одновременно в строке format, за исключением случая, когда строка, содержащая определители «%n$», может включать %% и %*. Если в format содержатся определители «%», то они задаются в порядке появления параметров указателей, указанных после. В форме «%n$» (есть в POSIX.1-2001, но отсутствует в C99), n — это десятичное целое, которое задаёт в какое место должен быть помещён ввод, то есть указывает на расположение n-го параметра указателя, передаваемого после format.

Преобразования

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

% Совпадает с литерой «%». То есть %% в строке формата соответствует одиночному символу данных «%». Преобразование не выполняется (но начальные пробельные символы отбрасываются) и назначения не происходит. d Совпадает с необязательным знаковым десятичным целым; следующий указатель должен быть указателем на int. D Эквивалентно ld; оставлено только для обратной совместимости (замечание: есть только в libc4. В libc5 и glibc %D просто игнорируется, что приводит к непонятным ошибкам в старых программах). i Совпадает с необязательным знаковым целым; следующий указатель должен быть указателем на int. Целое считывается как шестнадцатеричное число, если начинается с 0x или 0X, как восьмеричное, если начинается с 0 и как десятичное в остальных случаях. Используются только символы, подходящие для работы с выбранным основанием системы счисления. o Совпадает с необязательным беззнаковым восьмеричным целым; следующий указатель должен быть указателем на unsigned int. u Совпадает с необязательным беззнаковым десятичным целым; следующий указатель должен быть указателем на unsigned int. x Совпадает с необязательным беззнаковым шестнадцатеричным целым; следующий указатель должен быть указателем на unsigned int. X Эквивалентно x. f Совпадает с необязательным знаковым числом с плавающей запятой; следующий указатель должен быть указателем на float. e Эквивалентно f. g Эквивалентно f. E Эквивалентно f. a (C99) Эквивалентно f. s Совпадает с последовательностью непробельных символов; следующий указатель должен указывать на первый элемент массива символов достаточной длины для сохранения входной последовательности и завершающего байта null (‘\0’), который добавляется автоматически. Входная строка обрывается при появлении пробельного символа или достижении максимальной ширины поля, неважно что случится раньше. c Совпадает с последовательностью символов, чья длина задаётся максимальной шириной поля (по умолчанию 1); следующий указатель должен быть указателем на char, и должно быть достаточно места для всех символов (завершающий байт null не добавляется). Обычный пропуск начальных пробелов не выполняется. Чтобы пропустить пробелы, явно укажите их в формате. [ Совпадает с непустой последовательностью символов из задаваемого набора допустимых символов; следующий указатель должен быть указателем на char и должно быть достаточно места для всех символов в строке плюс завершающий байт null. Обычный пропуск начальных пробелов не выполняется. Строка будет состоять (или нет) из символов определённого набора; набор задаётся указанием символов между символом открывающей скобки [ и закрывающей скобки ]. Набором определяются исключающиеся символы, если первым символом после открывающей скобки является символ диакритического знака (^). Чтобы включить закрывающую скобку в набор, укажите её первым символом после открывающей скобки или диакритического знака; в любой другой позиции она закрывает набор. Символ переноса также является специализированным; если он указывается между двумя символами, то в набор добавляются все лежащие в промежутке символы. Чтобы добавить в набор символ переноса укажите его последним, перед конечной закрывающей скобкой. Например, [^]0-9-] означает, что «все символы, кроме закрывающей скобки, цифр от 0 до 9 и переноса». Строка обрывается при появлении символа не из набора (или, при указании символа диакритического знака, из) или при достижении ширины поля. p Совпадает со значением указателя (как выводится при %p в printf(3)); следующий указатель должен быть указателем на void. n Ничего не ожидается; вместо этого количество символов, использованных к настоящему времени из ввода, сохраняется по следующему указателю, который должен быть указателем на int. Это не преобразование и не увеличивает счётчик, возвращаемый функцией. Назначение может подавляться при указании символа подавления назначения *, но влияние этого на возвращаемое значение не определено. Поэтому преобразования %*n лучше не использовать.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Если конец входных данных был достигнут раньше, чем произошло хотя бы одно совпадение или при ошибке совпадения возвращается значение EOF. Значение EOF также возвращается при ошибке чтения; в этом случае для потока устанавливается индикатор ошибки (смотрите ferror(3)), а в errno указывается номер ошибки.

Источник

scanf () и fscanf () в C — простой, но мощный

Многие из нас знают традиционное использование scanf. Ну, вот некоторые из менее известных фактов

Ввод: «это значение 21,2»,
Вывод: значение прочитано 21,2

/ * C программа, чтобы продемонстрировать, что мы можем

игнорировать некоторую строку в scanf () * /

>
// Вход: это значение 100
// Вывод: чтение входного значения: a = 100

Теперь предположим, что мы не знаем, что представляют собой предыдущие символы, но мы точно знаем, что последнее значение является целым числом. Как мы можем отсканировать последнее значение как целое число?

Приведенное ниже решение работает, только если во входной строке нет пробелов.

/ * Пример программы на C для демонстрации использования * s * /
#include

// Ввод: «блаблабла 25»
// Вывод: прочитанное значение: 25

Объяснение :% * s в scanf используется для игнорирования некоторых входных данных при необходимости. В этом случае он игнорирует ввод до следующего пробела или новой строки. Аналогично, если вы напишите% * d, он будет игнорировать целые числа до следующего пробела или новой строки.

Вышеуказанный факт не может показаться полезным на первый взгляд. Чтобы понять его использование, давайте сначала посмотрим на fscanf ().

fscanf (): Устали от всего слипчивого синтаксиса для чтения из файлов? хорошо, fscanf приходит на помощь.

fscanf читает из файла, на который указывает указатель FILE (ptr), вместо чтения из входного потока.

Рассмотрим следующий текстовый файл abc.txt

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

/ * c программа, демонстрирующая fscanf и его использование * /
#include

printf ( «no such file.» );

/ * Предполагая, что abc.txt имеет содержимое ниже

ИМЯ ВОЗРАСТНЫЙ ГОРОД

Упражнение: Подсчитайте количество слов, символов и строк в файле с помощью fscanf!

Эта статья предоставлена Нихилом Чакравартулой. Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Источник

Технология программирования на Си: представление матриц, работа с файлами и с текстами

Работа с файлами

Открытие файла: функция fopen

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

Значения символов в строке mode сведены в следующую таблицу:

rОткрыть существующий файл на чтение
wОткрыть файл на запись. Старое содержимое файла теряется, в случае отсутствия файла он создаётся.
aОткрыть файл на запись. Если файл существует, то запись производится в его конец.
tОткрыть текстовый файл.
bОткрыть бинарный файл.
+Разрешить и чтение, и запись.

Несколько примеров открытия файлов:

Константа NULL

Диагностика ошибок: функция perror

Функция perror печатает сначала пользовательское сообщение об ошибке, затем после двоеточия системное сообщение. Например, при выполнении приведенного фрагмента в случае ошибки из-за отсутствия файла будет напечатано

Функции бинарного чтения и записи fread и fwrite

Функция чтения fread имеет следующий прототип:

В этом примере файл » tmp.dat » открывается на чтение как бинарный, из него читается 100 вещественных чисел размером 8 байт каждое. Функция fread возвращает реальное количество прочитанных чисел, которое меньше или равно, чем 100.

Функция fread читает информацию в виде потока байтов и в неизменном виде помещает ее в память. Следует различать текстовое представление чисел и их бинарное представление! В приведенном выше примере числа в файле должны быть записаны в бинарном виде, а не в виде текста. Для текстового ввода чисел надо использовать функции ввода по формату, которые будут рассмотрены ниже.

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

Закрытие файла: функция fclose

Для закрытия файла используется функция fclose с прототипом

Пример: подсчет числа символов и строк в текстовом файле

Пример выполнения программы: она применяется к собственному тексту, записанному в файле «wc.cpp.

Форматный ввод-вывод: функции fscanf и fprintf

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

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

Функция fscanf возвращает число успешно введенных элементов. Таким образом, возвращаемое значение всегда меньше или равно количеству процентов внутри форматной строки (которое равно числу фактических аргументов минус 2).

%dвывод целого десятичного числа
%10dвывод целого десятичного числа, для записи числа отводится 10 позиций, запись при необходимости дополняется пробелами слева
%lfвывод вещественного число типа double в форме с фиксированной десятичной точкой
%.3lfвывод вещественного число типа double с печатью трёх знаков после десятичной точки
%12.3lfвывод вещественного число типа double с тремя знаками после десятичной точки, под число отводится 12 позиций
%cвывод одного символа
%sконец строки, т.е. массива символов. Конец строки задается нулевым байтом

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

В результате выполнения этой программы в файл «tmp.dat» будет записан следующий текст:

Понятие потока ввода или вывода

В операционной системе Unix и в других системах, использующих идеи системы Unix (например, MS DOS и MS Windows), применяется понятие потока ввода или вывода. Поток представляет собой последовательность байтов. Различают потоки ввода и вывода. Программа может читать данные из потока ввода и выводить данные в поток вывода. Программы можно запускать в конвейере, когда поток вывода первой программы является потоком ввода второй программы и т.д. Для запуска двух программ в конвейере используется символ вертикальной черты | между именами программ в командной строке. Например, командная строка

перенаправляет выходной поток программы abcd в файл «tmp.res», т.е. данные будут выводиться в файл вместо печати на экране терминала. Соответственно, командная строка

заставляет программу abcd читать исходные данные из файла «tmp.dat» вместо ввода с клавиатуры. Командная строка

вводит значение целочисленной переменной n из входного потока. Строка

выводит значение переменой n в выходной поток. Строка

По умолчанию, стандартный выходной поток и выходной поток для печати ошибок назначены на экран терминала. Однако операция перенаправления вывода в файл > действует только на стандартный выходной поток. Например, в результате выполнения командной строки

обычный вывод программы abcd будет записываться в файл «tmp.res», а сообщения об ошибках по-прежнему будут печататься на экране терминала. Для того чтобы перенаправить в файл «tmp.log» стандартный поток печати ошибок, следует использовать командную строку

Таким образом, существование двух разных потоков вывода позволяет при необходимости отделить мух от котлет, т.е. направить нормальный вывод и вывод информации об ошибках в разные файлы.

Функции scanf и printf ввода и вывода в стандартные потоки

Источник

scanf()

Теперь поговорим о каждом из этих видов.

Спецификаторы преобразования

Таблица 8.3. Спецификаторы преобразования для функции scanf()
КодЗначение
%aЧитает значение с плавающей точкой (только С99)
%cЧитает одиночный символ
%dЧитает десятичное целое число
%iЧитает целое число как в десятичном, так и восьмеричном или шестнадцатеричном формате
%eЧитает число с плавающей точкой
%fЧитает число с плавающей точкой
%gЧитает число с плавающей точкой
Читает восьмеричное число
%sЧитает строку
%xЧитает шестнадцатеричное число
%pЧитает указатель
%nПринимает целое значение, равное количеству уже считанных символов
%uЧитает десятичное целое число без знака
%[]Читает набор сканируемых символов
%%Читает знак процента

Ввод чисел

Функция scanf() прекращает чтение числа тогда, когда встречается первый нечисловой символ.

Ввод целых значений без знака


Чтение одиночных символов с помощью scanf()

При чтении одиночного символа символы разделителей читаются так же, как и любой другой символ, хотя при чтении данных других типов разделители интерпретируются как разделители полей. Например, при вводе с входного потока «x y» фрагмент кода

Чтение строк


Ввод адреса


Спецификатор %n

Спецификатор %n указывает, что scanf() должна поместить количество символов, считанных (до того момента, когда встретился %n ) из входного потока в целую переменную, указанную соответствующим аргументом.

Использование набора сканируемых символов

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

В большинстве реализаций для указания диапазона можно использовать дефис. Например, указанный ниже набор сканируемых символов дает функции scanf() указание принимать символы от А до Z:

Следует обратить внимание на такой важный момент: набор сканируемых символов чувствителен к регистру букв. Если нужно сканировать буквы и на верхнем, и на нижнем регистре, то их надо указывать отдельно для каждого регистра.

Пропуск лишних разделителей

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

Символы в управляющей строке, не являющиеся разделителями


Функции scanf() необходимо передавать адреса

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

Модификаторы форматат

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

в str будут помешены буквы UVWXYZ. Ввод из поля может завершиться и до того, как будет достигнута максимальная длина поля — если встретится разделитель. В таком случае scanf() переходит к следующему полю.

На заметкуВ С99 для функции scanf() имеются еще и другие модификаторы типа; о них рассказывается в части II.

Подавление ввода

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *