Ниже представлены сокращенные заголовки некоторых функций для вывода в стандартный поток stdout, связанный с экраном монитора (консольным окном).
Вывод (печать) символа:
int putchar(int c);
параметр c задает код печатаемого символа, функция возвращает код символа.
Пример вызова:
putchar(‘A’);
Вывод (печать) строки:
int puts(const char * s);
s – указатель на строку, строка заканчивается символом с кодом 0, при выводе строки на печать в конец добавляется \n (переход на новую строчку), возвращаемое значение - код последнего символа, всегда \n или значение EOF в случае ошибки. EOF (End Of File) – константа, объявленная в заголовочном файле stdio.h, ее значение равно -1.
Пример вызова:
puts(“Hello world”);
Вывод данных в соответствии с заданным форматом (форматированный вывод):
int printf(const char *format, …);
функция с переменным количеством параметров, параметр format - указатель на строку, данная строка выводится на консоль без изменений, за исключением шаблонов преобразования, которые могут присутствовать в строке. Как правило, число шаблонов преобразования соответствует числу необязательных параметров, которые присутствуют при вызове функции, порядок следования шаблонов преобразования в строке соответствует порядку необязательных параметров функции. Каждый шаблон преобразования задает формат вывода, соответствующего ему параметра, при выводе строки шаблон преобразования заменяется параметром в заданном им формате. Возвращаемое значение – число выведенных (напечатанных) символов.
|
|
Шаблон преобразования в строке всегда начинается с символа «%». Формат шаблона преобразования:
%[flags][width][.prec][h:l:L]type
flags может быть одним из символов:
«-» - надпись выравнивается по левому краю (по умолчанию по правому),
«+» - числу должен предшествовать знак (перед положительным числом ставится знак «+»),
«#» - случай будет рассмотрен ниже, после разбора поля type;
width – целая константа, задает минимальную ширину поля вывода в символах;
prec – целая константа, задает максимальное число выводимых символов, или число цифр после точки при выводе вещественных чисел;
h:l:L – префиксы используются для работы с целыми или вещественными значениями, чтобы показать, что аргумент short, long (double);
type - определяет тип аргумента и формат его вывода, возможные значения это символы:
«d», «i» - тип int, вывод целого в десятичной системе счисления;
«o» - тип int, вывод целого в восьмеричной системе счисления (без 0 впереди);
«x», «X» - тип int, вывод целого в шестнадцатеричной системе счисления (без 0x или 0X впереди) c применением соответственно цифр abcdef и ABCDEF;
«u» - тип unsigned int, вывод целого без знака в десятичной системе счисления;
|
|
«c» - тип int (к нему приводится тип char), вывод отдельного символа, символ задается своим кодом;
«s» - тип char *, вывод символов строки, строка должна заканчиваться символом с кодом 0;
«f» - тип double, вывод вещественного в форме с точкой;
«e», «E» - тип double, вывод вещественного в форме со знаком экспоненты (печатается символ e или E);
«g», «G» - тип double, использует более короткий из форматов %е/%E или %f;
«p» - тип void *, печать значения указателя;
«%» - преобразование аргументов не выполняется, печатается символ «%».
Рассмотрим теперь назначение в качестве флага символа «#», символ используется с некоторыми типами аргументов. Поставленный перед кодами g, G, f, e и Е, он гарантирует наличие десятичной точки даже в случае отсутствия десятичных цифр после точки. Если поставить символ «#» перед кодами формата х и X, то шестнадцатеричное число будет выведено с префиксом 0х или 0Х. Если же его поставить перед форматом «о», то восьмеричное число будет выведено с префиксом 0.
Примеры использования функции:
#include <stdio.h>
void main()
{
double x=10.55, y=-12.333;
int a1=10, a2=20;
char Str[]="Hello world";
char Ch='A';
printf("x=%fy=%fa1=%da2=%d", x, y, a1, a2);
// Печатается x=10.550000y=12.333000a1=10a2=20
printf("\nx=%8.2fy=%-8.2fa1=%+4da2=%3d", x, y, a1, a2);
// Печатается x= 10.55y=-12.33 a1= +10a2= 20
printf("\n%s %c %%", Str, Ch); // Печатается Hello world A %
}
8.4. Функции для считывания из потока stdin
Рассмотрим некоторые функции для считывания из стандартного потока stdin, по умолчанию связанного с клавиатурой. Все данные функции останавливают выполнение программы и ждут ввода с клавиатуры, после ввода данных требуется нажать клавишу «Enter».
Чтение символа:
int getchar();
функция возвращает код символа. Пример вызова:
char Ch;
Ch=getchar();
Чтение строки символов:
char * gets(char * s);
s – указатель на массив, куда записывается строка, строка читается пока во входном потоке не появится символ «\n» (на клавиатуре нажата клавиша «Enter»), при этом в строку записывается символ с кодом 0, возвращаемое значение адрес строки или NULL в случае ошибки.
Пример вызова:
char Str[64];
printf(“Введите строку символов:”); gets(Str);
Считывание данных и запись их в переменные в соответствии с заданным форматом:
int scanf(const char * format, …);
функция с переменным количеством параметров, внешне функция похожа на printf, обязательный параметр format содержит шаблоны преобразования, данные преобразуются в соответствии с шаблонами преобразования и записываются в переменные, выступающие в качестве необязательных параметров, возвращаемое значение - число параметров, успешно преобразованных или EOF при ошибке. В строке, определяющей формат, кроме шаблонов преобразования могут быть и другие символы, это означает, что во входном потоке обязательно должны встретиться эти же символы при этом они будут пропускаться.
Шаблон преобразования начинается с символа «%», формат шаблона преобразования:
%[*][width][h:l:L]type
«*» - необязательный символ, в этом случае поле сканируется, но в память не записывается, используется для пропуска полей;
width – целая константа определяет максимальное число символов, считанных из входного потока;
[h:l:L] - то же самое, что и в printf;
type - определяет тип аргумента и его формат, возможные значения это символы:
«d» - тип int * (при вводе в качестве параметра передается адрес переменной – передача параметра по указателю), целая переменная в десятичной системе счисления;
«i» - тип int *, целое может вводится в десятичной, восьмеричной (0 в начале) или шестнадцатеричной (0x или 0X в начале) системах счисления;
«o» - тип int *, целая переменная в восьмеричной системе счисления (с нулем или без нуля впереди);
«x», «X» - тип int *, целая переменная в шестнадцатеричной системе счисления (с или без 0x/0X впереди);
«u» - тип unsigned int *, целая переменная в десятичной системе счисления без знака;
|
|
«c» - тип char *, ввод отдельного символа;
«s» - тип char *, ввод строки, автоматически в конец строки (массива символов) записывается символ с кодом 0, следует отметить, что строка считывается из входного потока до любого символа разделителя, включая «пробел»;
«f», «e», «E», «g», «G» - тип float *, при вводе эти символы эквивалентны, ввод вещественного в форме с точкой или со знаком экспоненты;
«%» - присваивание не выполняется, просто в строке символ «%», обозначает, что во входном потоке должен быть символ «%».
Примеры использования функции:
#include <stdio.h>
void main()
{
float x;
int a;
char Ch;
double X;
char Str[64];
printf("x, a, Ch: ");
scanf("%f %d %c", &x, &a, &Ch);
// Надо вводить значения через пробелы как в строке format
printf("x=%f a=%d Ch=%c", x, a, Ch);
printf("\nX="); scanf("%lf", &X); // Ввод типа double
printf("Str: "); scanf("%s", Str); // Ввод строки
printf("propusk: "); scanf("%*d.%d", &a);
// Если в потоке вводится 10.12 то в a запишется 12
printf("X=%f Str: %s a=%d", X, Str, a);
}
Ввод- вывод в файлы
Открытие файла
Прежде, чем работать с файлом на диске или сменном носителе его необходимо открыть. Для этого заранее объявляется указатель на структуру FILE.
Заголовок функции открытия файла:
FILE * fopen(const char *name, const char * mode);
параметры: name – строка, содержащая имя файла, mode – строка, содержащая режим открытия файла, mode может состоять из 2-х частей, 1-ая часть обязательная, возможные значения символы:
«r» – режим «чтение», файл должен существовать;
«w» – режим «запись», если файл существует, то его содержимое стирается; «a» – режим «добавление», если файл не существует, он создается заново, если файл существует, содержимое его не теряется, запись производится всегда в конец файла;
«r+» – режим «чтение + запись», файл должен существовать (как при чтении);
«w+» – режим «запись + чтение», если файл существует, то его содержимое стирается (как при записи);
«a+» – режим «добавление + чтение», как в режиме «добавление» запись всегда производится в конец файла.
Вторая часть необязательная, возможные значения символы:
«t» – файл открывается в текстовом режиме (по умолчанию), при чтении последовательность символов \r\n преобразуется в \n, при записи происходит обратное преобразование, кроме того, символ с кодом 1A интерпретируется как конец файла;
|
|
«b» – файл открывается в двоичном режиме, подобные преобразования не проводятся.
Функция возвращает указатель на структуру FILE или NULL в случае ошибки.
Примеры открытия файлов:
FILE *pF;
pF=fopen(“MyFile.txt”, “w”);
Здесь создается файл в текущем каталоге операционной системы с именем MyFile.txt, файл создается для записи в текстовом режиме. Если файл с таким имен уже существовал, то старое его содержимое стирается.
FILE *pF;
pF=fopen(“C:\\Catalog1\\MyFile.dat”, “rb”);
Открывается файл с именем MyFile.dat на диске С: в каталоге Catalog1, файл открывается для чтения в двоичном режиме, файл должен существовать, в противном случае функция возвращает значение NULL. Следует обратить внимание на то, что символ «\» является внутри строки служебным, поэтому, чтобы его включить в строку в качестве обычного символа передним ставится тот же символ «\».
FILE *pF;
pF=fopen(“C:\\Catalog1\\MyFile.txt”, “a+”);
Открывается файл с именем MyFile.txt на диске С: в каталоге Catalog1, файл открывается для добавления и чтения в текстовом режиме, файл может существовать или, если он не существует, то он создается заново.
Закрытие файла
Открытые файла используют ресурсы операционной системы, поэтому, если работа с ними завершена, их требуется закрывать. Кроме того, если открыт файл для записи и при завершении работы приложения он не закрыт, то возможно не все записанные данные окажутся в этом файле, если запись проводится через буфер ввода – вывода.
Заголовок функции для закрытия файла:
int fclose(FILE * stream);
параметр stream – указатель на структуру FILE, который связан с открытым файлом, функция возвращает 0, если закрытие реализовано или EOF в случае ошибки.