float b, d; // ft – инициализированная строка форматов:
char c[7], g, * ft = “ a = %d b = %f c = %s%f%d%c”
f = fopen ( “8scanf.dat” , “r” );
fscanf (f, ft, &a, &b, c, &d, &e, &g);
}
Содержимое файла “8scanf.dat” – с исходными данными:
а = 123, в = 2.5, с = asdfg 3.7 25k
В приведенном примере программы строка форматов включает подстроки: а = , Ь = , с = . Эти подстроки при считывании данных из файла игнорируются. В результате выполнения программы переменные списка аргументов функцииfscanfполучат следующие значения: а = 123, в = 2.5, с = “asdfg”, d = 3.7 e =25, g = ‘k’.
типов из строки с помощью функцииsscanf
(пример старой версии)
{ char str [ ] = “Из втой строки читаются: "
"целое: i = -123, "
"шестнадцатеричное целое: j = 0x10, " "целое без знака: ui - 65535, " "значение с плавающей точкой: f = -123е-2, " "несколько строк и символов . "
В силу определенных особенностей функцийsscanfиfscanf возможны случаи, когда значения типаfloatилиdoubleвводятся неверно, например, в элементы массива арифметических данных или в элементы массива структур. В этом случае избежать ошибки можно, используя промежуточную скалярную переменную соответствующего типа (floatилиdouble). Надо сначала ввести значение в эту скалярную переменную, а затем переслать ее в элемент массива структур. Пример фрагмента программы для ввода значений из файла в строку с последующей 'распаковкой' этой строки приведен на далее.
(пример старой версии)
#define PR struct data;
PR {int nb, gv; char ts [8], float gr; );
float skl; //skl - скаляр
PR s[5]; //s – массив структур типа PR
{ ... for ( i = 0 ; i <= 5; i++ )
{fgets ( str, 55, fid ) ;
sscanf ( str, “%d%d6c%f” ,
&s[ i ] . nb, &s [ i ].gv, s [ i ].ts, &skl); // - ввод значения в skl
s [ i ].gr = skl; // - пересылка skl в s [ i ].gr - элемент массива s
...}
В этом примере с помощью функцииsscanfзначение типаfloatвводится сначала в скалярную переменную skl, а затем пересылается в s [ i ].gr - в элемент массива структур. Для других типов данных этого не требуется.
Форматный вывод данных осуществляется с помощью функцийprintf,fprintf, sprintf. Правила их использования идентичны.
Прототип функцииprintf:
int printf ( char * format [ , arg ... ] ) ;
Функцияfprintfвыводит в стандартный выводной потокstdout(на экран) значения, определенные ее аргументами. Функция имеет переменное количество параметров. Значение первого параметраformatопределяет адрес строки, которая управляет интерпретацией выводимых значений. Аргументы определяют имена переменных, значения которых должны быть выведены.