Блочный ввод и вывод
Вывод символов или строк
Вывод символов и строк выполняют функции fputc, fputs, putc, putchar, puts
#include <stdio.h>
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);
fputc() выводит символ c, преобразуя его в unsigned char, в поток stream.
fputs() выводит строку s в поток s tream, не завершая ее символом '\0'.
putc() эквивалентна fputc(), но реализована через макрос.
putchar(c) эквивалентеа putc(c,stdout).
puts() выводит строку s в поток stdout.
Возвращаемые значения
Функции fputc(), putc() и putchar() возвращают символ, выведенный как unsigned char, преобразованный к типу int.
Функции puts() и fputs() возвращают неотрицательное число, длину строки.
С помощью функций fread, fwrite организуется так называемый байтовый поток ввода - вывода
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
Функция fread() читает nmemb блоков данных размером size каждый из потока stream и сохраняет их в памяти по адресу, задаваемому указателем ptr.
Функция fwrite() записывает nmemb блоков данных размером size байтов в поток stream, выбирая их из памяти, адресуемой указателем ptr.
|
|
Функции fread() и fwrite() возвращают число успешно обработанных блоков (а не байтов) и сообщение об ошибке в случае неудачи.
Другие функции работы с файлами:
int fclose(FILE *stream); // закрывает поток, возвращает 0 в случае успеха
int _fcloseall(void); //закрывает все открытые потоки, возвращает количество закрытых файлов
int fflush(FILE *stream); // запись («сброс») буфера в поток
int feof(FILE *stream); // возвращает 1, если достигнут конец файла (потока)
int fgetpos(FILE *stream, fpos_t *pos); // возвращает смещение курсора
int fseek(FILE *stream, long offset, int origin); // смещает курсор в заданную позицию
Существуют стандартные потоки (тип данных — FILE*):
stdin — стандартный поток ввода (по умолчанию — консоль);
stdout — стандартный поток вывода (по умолчанию — консоль);
stderr — стандартный поток ошибок;
stdaux — стандартный вспомогательный поток;
stdprn — стандартный принтер.
Данные потоки могут быть переопределены с использованием функции fopen.
Для форматированного вывода в поток предназначена функция
fprintf(FILE* stream, const char* formatted_string, arguments, …)
Для подстановки значений переменных в строку вывода используют символы подстановки (спецификаторы формата), начинающиеся с символа «%»:
% [флаги][размер][.точность][модификатор_длины] тип_данного
Флаги:
«-» — выравнивание результата по левому краю (по умолчанию — по правому относительно заданного количества выводимых символов);
«+» — результат всегда начинается со знака (+/-);
«#» — особая форма отображения результата.
Размер показывает, сколько символов отводится для записи результата, может быть представлен в следующих форматах:
|
|
n — минимум n символов отводится для записи числа, недостающие символы заменяются пробелами;
0n — то же, но недостающие символы заменяются нулями;
* — список аргументов содержит размеры данных.
Точность показывает для вещественных чисел количество знаков после десятичной точки.
Модификатор длины может принимать одно из значений:
F — «длинный» указатель;
N — «короткий» указатель;
h — short int;
l — long int, double;
L — long double.
Тип данного может принимать одно из значений:
%d, %i — знаковое десятичное целое;
%u — беззнаковое десятичное целое;
%o — беззнаковое восьмеричное целое;
%x, %X — беззнаковое шестнадцатеричное целое;
%f — знаковое вещественное;
%e, %E —вещественное в экспоненциальной форме;
%g, %G —вещественное, форма зависит от числа, размера и точности;
%c — символ;
%s — строка;
%% — символ «%»;
%n, %p — указатель.
Аргументы, передаваемые в функцию, должны соответствовать количеству и типу спецификаторам формата.
Для форматированного ввода данных из потока используется функция
fscanf(FILE* stream, const char* formatted_string, arguments, …)
Строка также может содержать спецификаторы формата, при этом:
— при невозможности предобразования строки в число, число принимает значение ноль;
— строкой считается слово до разделителя (пробел, табуляция, перевод строки).
Для стандартных потоков определены аналогичные функции:
printf(const char* formatted_string, arguments, …)
scanf(const char* formatted_string, arguments, …)
являющиеся аналогами описанных ранее функций, разница заключается в том, что используются стандартные потоки ввода и вывода (stdin, stdout), которые в качестве аргументов не указываются.
Определены функции, использующие вместо потока строку:
sprintf(char *dest, const char* formatted_string, arguments, …)
sscanf(char *src, const char* formatted_string, arguments, …)